前言

由于Query Strings和URL模块的API都比较少和简单,所以我把这两个模块放在一起讲。

Query Strings

相信从字面上理解,大家就已经知道此模块是用于处理Query String的。

querystring.stringify(obj, [sep], [eq])

此方法可以将object转换成字符串,三个参数分别的意义是:

  • obj 待转换的对象

  • sep 此参数是一个可选参数,表示多个参数之间的分隔符(一般使用'&'作为分隔符,默认是'&')

  • eq 此参数也是一个可选参数,表示参数与对应值之间的分隔符(一般使用'='作为分隔符,默认是'=')

var querystring = require('querystring');

var obj = {
  method: 'add',
  user: 'admin',
  age: 31,
  score: [98, 91]
};

console.log(querystring.stringify(obj)); // method=add&user=admin&age=31&score=98&score=91
console.log(querystring.stringify(obj, ';', ':')); // method:add;user:admin;age:31;score:98;score:91
querystring.parse(str, [sep], [eq], [options])

querystring.parse是querystring.stringify方法的逆。参数sep和eq与querystring.stringify有着相同的意义,但是此方法有第四个可选参数,此参数是可以配置项内目前为止就一个配置参数:maxKeys,表示最大处理的keys数量,超过此数量就默认略过(maxKeys的默认值为1000)

var querystring = require('querystring');

console.log(querystring.parse('method=add&user=admin&age=31&score=98&score=91')); // { method: 'add', user: 'admin', age: '31', score: [ '98', '91' ] }
console.log(querystring.parse('method:add;user:admin;age:31;score:98;score:91', ';', ':')); // { method: 'add', user: 'admin', age: '31', score: [ '98', '91' ] }
console.log(querystring.parse('method=add&user=admin&age=31&score=98&score=91', '&', '=', { maxKeys: 2 })); // { method: 'add', user: 'admin' }

这里需要注意的是,如果我们需要用到options参数,那么sep和eq是不可以省略的。不然的话,解析会出乎于预期:

var querystring = require('querystring');

console.log(querystring.parse('method=add&user=admin&age=31&score=98&score=91', { maxKeys: 2 })); // { method: 'add&user=admin&age=31&score=98&score=91' }
querystring.escape、querystring.unescape

querystring.escape其实就是对字符串进行urlencode,而querystring.unescape则是对字符串进行urldecode

var querystring = require('querystring');

console.log(querystring.escape('a=ss&b=111')); // a%3Dss%26b%3D111
console.log(querystring.unescape('a%3Dss%26b%3D111')); // a=ss&b=111
URL

此模块是处理url相关的问题。

url.parse(urlStr, [parseQueryString], [slashesDenoteHost])

将字符串转换成object对象,与querystring.parse功能类似。

  • urlStr 表示需要转换的字符串

  • parseQueryString 如果将此项设置为true,则表示使用querystring模块转换querystring

  • slashesDenoteHost 如果此项设置为true,则表示将双斜线后的当做为host

var url = require('url');

console.log(url.parse('HTTP://admin:[email protected]:3000/a/b/c?test=true#list')); // { protocol: 'http:',
                                                                                 //   slashes: true,
                                                                                 //   auth: 'admin:123',
                                                                                 //   host: '172.16.0.1:3000',
                                                                                 //   port: '3000',
                                                                                 //   hostname: '172.16.0.1',
                                                                                 //   hash: '#list',
                                                                                 //   search: '?test=true',
                                                                                 //   query: 'test=true',
                                                                                 //   pathname: '/a/b/c',
                                                                                 //   path: '/a/b/c?test=true',
                                                                                 //   href: 'http://admin:[email protected]:3000/a/b/c?test=true#list' }

console.log(url.parse('HTTP://admin:[email protected]:3000/a/b/c?test=true#list', true)); // { protocol: 'http:',
                                                                                       //   slashes: true,
                                                                                       //   auth: 'admin:123',
                                                                                       //   host: '172.16.0.1:3000',
                                                                                       //   port: '3000',
                                                                                       //   hostname: '172.16.0.1',
                                                                                       //   hash: '#list',
                                                                                       //   search: '?test=true',
                                                                                       //   query: { test: 'true' },
                                                                                       //   pathname: '/a/b/c',
                                                                                       //   path: '/a/b/c?test=true',
                                                                                       //   href: 'http://admin:[email protected]:3000/a/b/c?test=true#list' }

console.log(url.parse('//admin:[email protected]:3000/a/b/c?test=true#list', true, true)); // { protocol: null,
                                                                                        //   slashes: true,
                                                                                        //   auth: 'admin:123',
                                                                                        //   host: '172.16.0.1:3000',
                                                                                        //   port: '3000',
                                                                                        //   hostname: '172.16.0.1',
                                                                                        //   hash: '#list',
                                                                                        //   search: '?test=true',
                                                                                        //   query: { test: 'true' },
                                                                                        //   pathname: '/a/b/c',
                                                                                        //   path: '/a/b/c?test=true',
                                                                                        //   href: 'http://admin:[email protected]:3000/a/b/c?test=true#list' }
url.format(urlObj)

此方法是url.parse的逆方法,就是将object转换成字符串

var url = require('url');

var obj = {
  protocol: 'http:',
  slashes: true,
  auth: 'admin:123',
  host: '172.16.0.1:3000',
  port: '3000',
  hostname: '172.16.0.1',
  hash: '#list',
  search: '?test=true',
  query: {
    test: 'true'
  },
  pathname: '/a/b/c',
  path: '/a/b/c?test=true',
  href: 'http://admin:[email protected]:3000/a/b/c?test=true#list'
};

console.log(url.format(obj)); // http://admin:[email protected]:3000/a/b/c?test=true#list
url.resolve(from, to)

可以简单地理解成:用后面的对应的属性替换前面的属性。过程可以理解成(内部过程可能更加复杂,以下步骤仅供理解,不是官方步骤):

  • 第一步:调用url.parse
  • 第二步:Object.assign
  • 第三部:url.stringify
var url = require('url');

var url = require('url');

console.log(url.resolve('/one/two/three', '//host.com:300/four'))         // //host.com:300/four
console.log(url.resolve('http://example.com/', '/one'))    // 'http://example.com/one'
console.log(url.resolve('http://example.com/one', 'http://ssss.com/one/one/two')) // 'http://ssss.com/one/one/two'
总结

Query Strings模块和URL模块其实都是非常实用的两个模块,但是由于我们做node一般都使用第三方框架,如:express、koa、restify等。里面都已经封装好了对应的方法,所以这两个模块可能在实际开发中用到的不多,但是在做node原生开发时(不使用第三方框架),会非常有用。

results matching ""

    No results matching ""