本文对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 wendingding$ node > var str = "name=LiuY&password=931007&star=best" ; undefined > var obj = querystring.parse(str); undefined > obj { 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' } > 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' : '' } > querystring.parse("name:LiuY&password:931007&star:best" ,"&" ,":" ); { name : 'LiuY' , password : '931007' , star : 'best' } > 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 wendingding$ node > var obj = { name : 'wendingding' , password : '911021' , star : 'other' } undefined > querystring.stringify(obj); 'name=wendingding&password=911021&star=other' > querystring.stringify(obj,"@" ); 'name=wendingding@password=911021@star=other' > querystring.stringify(obj,"&" ,":" ); 'name:wendingding&password:911021&star:other' > 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.parse
和JSON.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)); console .log(parse(stringify(obj)));