跳到主要内容

Node API - Querystring

· 阅读需 4 分钟

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

parsestringify总是形影不离,在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,则表示不限制数量。

示例如下:

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()

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不写时间,不写版本,行文也不格式化,极易产生误解。后来总算明白了,别人嚼烂剩下,心里要有个谱儿。主动被动之间,不只有情趣!