本文对Node的内置模块Query String进行介绍,包括基本情况和简单使用。

1.0 模块简介

Query String是Node的内置核心模块之一,无需单独安装。在Nodejs文件中可以直接在代码里通过var querystring = require("querystring")的方式来进行加载,该模块主要用来处理URL路径中查询字符串的转换工作。

查询字符串 在GET请求的URL路径中,请求的参数会以键值对的方式拼接(键和值之间使用=连接,多个键值对之间使用&符号连接)并以?分隔符跟在请求路径的后面。这一段参数字符串其实就是查询字符串,譬如在http://www.wendingding.com/doc?name=node系列-NPM&page=1这个URL路径中,name=node系列-NPM&page=1就是所谓的查询字符串。

在命令行环境中可以直接通过REPL来查看Query String模块的内容,这个模块本身返回一个对象。

1
2
3
4
5
6
7
8
9
bogon:~ wendingding$ node
> querystring
{ unescapeBuffer: [Function: unescapeBuffer],
unescape: [Function: qsUnescape],
escape: [Function: qsEscape],
stringify: [Function: stringify],
encode: [Function: stringify],
parse: [Function: parse],
decode: [Function: parse] }

Query String模块中两个比较重要的方法

  • parse方法           用于将查询字符串转换为对象。
  • stringify方法 用于将对象序列化为查询字符串。

2.0 基本使用

这里主要介绍Query String模块中常用方法的基本使用、这些方法的作用、参数传递以及返回值结构等情况,并提供简短的代码示例。

parse方法

作用 把查询字符串转换(反序列化)为对象。
语法 querystring.parse( str , [ sep ] , [ eq ] , [ options ])
参数

  • str
    字符串类型 | 指定待转换的查询字符串。
  • sep
    字符串类型 | 指定查询字符串中的分隔字符,默认为&
  • eq
    字符串类型 | 指定查询字符串中的分配字符(连接键和值),默认为=
  • options
    对象类型 | 设置maxKeys字段的值可以来控制转换结果中属性的个数。

返回值 反序列化成功后,将返回转换后的对象。
示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//001 最简单的使用方式
wendingding$ node
> var str = "name=LiuY&password=931007&star=best";
undefined
> var obj = querystring.parse(str);
undefined
> obj
{ name: 'LiuY', password: '931007', star: 'best' }

//002 测试分割字符参数
> querystring.parse("name=LiuY&password=931007&star=best");
{ name: 'LiuY', password: '931007', star: 'best' }
> querystring.parse("name=LiuY&password=931007&star=best","@");
{ name: 'LiuY&password=931007&star=best' }
> querystring.parse("name=LiuY@password=931007@star=best","@");
{ name: 'LiuY', password: '931007', star: 'best' }

//003 测试分配字符
> querystring.parse("name=LiuY&password=931007&star=best","&","=");
{ name: 'LiuY', password: '931007', star: 'best' }
> querystring.parse("name=LiuY&password=931007&star=best","&",":");
{ 'name=LiuY': '', 'password=931007': '', 'star=best': '' }
> querystring.parse("name:LiuY&password:931007&star:best","&",":");
{ name: 'LiuY', password: '931007', star: 'best' }

//004 测试配置对象
> querystring.parse("name=LiuY&password=931007&star=best","&","=",{maxKeys:2});
{ name: 'LiuY', password: '931007' }
> querystring.parse("name=LiuY&password=931007&star=best","&","=",{maxKeys:1});
{ name: 'LiuY' }
> querystring.parse("name=LiuY&password=931007&star=best","&","=",{maxKeys:0});
{ name: 'LiuY', password: '931007', star: 'best' }
注意 options配置对象中当字段maxKeys的值为0时等价于没有设置该参数。

stringify方法

作用 把对象序列化为查询字符串。
语法 querystring.stringify( obj , [ sep ] , [ eq ] )
参数

  • obj
    对象类型      | 指定待转换的对象。
  • sep
    字符串类型 | 指定查询字符串中的分隔字符,默认为&
  • eq
    字符串类型 | 指定查询字符串中的分配字符(连接键和值),默认为=

返回值 序列化成功后,返回转换后的查询字符串。
示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//001 基本用法
wendingding$ node
> var obj = { name: 'wendingding', password: '911021', star: 'other' }
undefined
> querystring.stringify(obj);
'name=wendingding&password=911021&star=other'

//002 测试分隔字符参数
> querystring.stringify(obj,"@");
'name=wendingding@password=911021@star=other'

//003 测试分配字符参数
> querystring.stringify(obj,"&",":");
'name:wendingding&password:911021&star:other'

//004 如果生成的查询字符串中有中文那么默认进行转码处理
> querystring.stringify({ name: '文顶顶', password: '911021', star: 'other' });
'name=%E6%96%87%E9%A1%B6%E9%A1%B6&password=911021&star=other'

3.0 番外篇

通过学习我们发现,Query String模块不论是内部结构还是其主要方法的使用相对都是比较简单的。如果您对JavaScript语言比较熟悉那么就会发现Query String模块中的序列化和反序列方法同JavaScript语言中原生的JSON.parseJSON.stringify方法很像,而转换的过程和jQuery框架中$().serialize()内部依赖的$.param方法也几乎无差。

其实,如果要自己动手来实现也不会很复杂,下面列出示例代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function stringify(obj) {
var arrM = [];
for (var key in obj)
{
arrM.push(key + "=" + obj[key]);
}
return encodeURI(arrM.join("&"));
}

function parse(str) {
var objM = {};
var arrM = decodeURI(str).split("&");
for (var i = 0; i < arrM.length; i ++)
{
var keyAndValueArr = arrM[i].split("=");
objM[keyAndValueArr[0]] = keyAndValueArr[1];
}
return objM;
}

//测试代码和运行结果
var obj = {name:"文顶顶",age:18};
console.log(stringify(obj)); //name=%E6%96%87%E9%A1%B6%E9%A1%B6&age=18
console.log(parse(stringify(obj))); //{name: "文顶顶", age: "18"}