前端开发系列081-Node篇之queryString
一、模块简介
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模块的内容,这个模块本身返回一个对象。
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方法
用于将对象序列化为查询字符串。
二、基本使用
这里主要介绍Query String模块中常用方法的基本使用、这些方法的作用、参数传递以及返回值结构等情况,并提供简短的代码示例。
parse方法
作用 把查询字符串转换(反序列化)为对象。
语法 querystring.parse( str , [ sep ] , [ eq ] , [ options ])
参数
-
str字符串类型 | 指定待转换的查询字符串。
-
sep字符串类型 | 指定查询字符串中的分隔字符,默认为`&`。
-
eq字符串类型 | 指定查询字符串中的分配字符(连接键和值),默认为`=`。
-
options对象类型 | 设置maxKeys字段的值可以来控制转换结果中属性的个数。
返回值 反序列化成功后,将返回转换后的对象。
示例
//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' }
stringify方法
作用 把对象序列化为查询字符串。
语法 querystring.stringify( obj , [ sep ] , [ eq ] )
参数
-
obj对象类型 | 指定待转换的对象。
-
sep字符串类型 | 指定查询字符串中的分隔字符,默认为`&`。
-
eq字符串类型 | 指定查询字符串中的分配字符(连接键和值),默认为`=`。
返回值 序列化成功后,返回转换后的查询字符串。
示例
//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'
三、番外篇
通过学习我们发现,Query String模块不论是内部结构还是其主要方法的使用相对都是比较简单的。如果您对JavaScript语言比较熟悉那么就会发现Query String模块中的序列化和反序列方法同JavaScript语言中原生的JSON.parse
和JSON.stringify
方法很像,而转换的过程和jQuery框架中$().serialize()
内部依赖的$.param
方法也几乎无差。
其实,如果要自己动手来实现也不会很复杂,下面列出示例代码。
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"}