querystring 是一个实用的 URL query 字符串处理工具,可以序列化一串键值对字符串,也可以将对象转化成一段 a=b&c=d 形式的字符串。总之,非常好用,尤其是处理跟url query相关参数的时候。
说明:本文是基于 node@9.3.0 整理。查看官方文档
基本用法
在 node 环境下,我们可以直接 require 或 import,如下:
const querystring = require('querystring')
需要说明的是,npm上有一个 qs 包,跟querystring类似,但功能更强大,可以看看。
node querystring 公开的有四个方法,我们来看一看。
parse 爱 stringify
parse和stringify总是形影不离,在JSON中如此,这里也是一样。
querystring.parse(str[, sep[, eq[, options]]])
可选参数有点多,先来介绍一下:
- str:
String, 目标字符串; - sep:
String, str 中键值对间的分隔符,默认是&; - eq:
String, str 中key和value间的分隔符,默认是=; - options:
Object, 包含三个属性:- decodeURIComponent:
Function, 解码方法,默认使用querystring.unescape() - maxKeys:
Number, 可以解析的最大key数目,默认是1000。设为0,则表示不限制数量。
- decodeURIComponent:
示例如下:
querystring.parse('foo=bar&abc=xyz&abc=123')
/* Returns
{
foo: 'bar',
abc: ['xyz', '123']
}
*/
注意:官方文档说,返回的对象不完全继承js的Object, 所以诸如obj.toString, obj.hasOwnProperty之类未定义的方法,无法使用哦~
querystring.stringify(obj[, sep[, eq[, options]]])
sep,eq同上,默认分别是&,=.
- obj:
Object, 目标对象 - options:
Object, 包含一个方法- encodeURIComponent:
Function, 编码方法,默认使用querystring.escape()
- encodeURIComponent:
obj的属性有所限制,只能转化 String, Number, Boolean, String[], Number[], Boolean[]类型的的值,其他类型的值会被转化为空字符串。
示例如下:
querystring.stringify({ foo: 'bar', baz: ['qux', 'quux'], corge: '' });
// returns 'foo=bar&baz=qux&baz=quux&corge='
querystring.stringify({ foo: 'bar', baz: 'qux' }, ';', ':');
// returns 'foo:bar;baz:qux'
离开,还是留下?
escape or unescape,选择只取决于你。一般不怎么用。
官方有云,
The querystring.escape() method is used by querystring.stringify() and is generally not expected to be used directly. It is exported primarily to allow application code to provide a replacement percent-encoding implementation if necessary by assigning querystring.escape to an alternative function.
所以,用不用随你心意。我们这里就简单说下吧(反正写的都很简洁。。。)。
querystring.escape(str)
编码。
querystring.escape('https://nodejs.org/dist/latest-v9.x/docs/api/querystring.html?nav=faq&sa=sae')
// Returns 'https%3A%2F%2Fnodejs.org%2Fdist%2Flatest-v9.x%2Fdocs%2Fapi%2Fquerystring.html%3Fnav%3Dfaq%26sa%3Dsae'
querystring.unescape(str)
解码,与escape相反。
querystring.unescape('https%3A%2F%2Fnodejs.org%2Fdist%2Flatest-v9.x%2Fdocs%2Fapi%2Fquerystring.html%3Fnav%3Dfaq%26sa%3Dsae')
// Returns 'https://nodejs.org/dist/latest-v9.x/docs/api/querystring.html?nav=faq&sa=sae'
结语
说实话,之前从别人的文章中去看用法,总觉得捉急。md不写时间,不写版本,行文也不格式化,极易产生误解。后来总算明白了,别人嚼烂剩下,心里要有个谱儿。主动被动之间,不只有情趣!