在 Node.js
中,querystring
模块提供了用于处理 URL 查询字符串的实用工具。它可以将查询字符串解析为对象,也可以将对象序列化为查询字符串。
需要注意的是,从 Node.js v11.0.0 开始,querystring
模块已经被标记为过时(deprecated),推荐使用 URLSearchParams
API,它提供了更强大、更现代化的替代方案。不过,querystring
仍然存在并且可以使用。
1. Query Strings 模块概述
querystring
模块用于处理 URL 中的查询字符串。查询字符串是附加在 URL 后面的键值对,用于传递参数信息。例如,http://example.com?name=John&age=30
中的 name=John&age=30
就是查询字符串。这个模块的主要功能是将查询字符串解析成对象,或者将对象序列化为查询字符串。
2. Query Strings 的属性与方法
2.1 querystring.parse()
querystring.parse()
用于将 URL 查询字符串解析为对象。
语法:
querystring.parse(str[, sep[, eq[, options]]])
str
: 要解析的查询字符串。sep
: 可选,指定键值对的分隔符,默认为'&'
。eq
: 可选,指定键和值之间的分隔符,默认为'='
。options
: 可选,包含以下属性:decodeURIComponent
: 解码查询字符串中编码字符的函数,默认为decodeURIComponent
。maxKeys
: 限制解析后的键数量,默认无限制。
示例:
const querystring = require('querystring');
const queryString = 'name=John&age=30&city=New+York';
const parsed = querystring.parse(queryString);
console.log(parsed); // 输出:{ name: 'John', age: '30', city: 'New York' }
在这里,querystring.parse()
将查询字符串 name=John&age=30&city=New+York
解析为对象 { name: 'John', age: '30', city: 'New York' }
。
自定义分隔符:
const queryString = 'name:John;age:30;city:New York';
const parsed = querystring.parse(queryString, ';', ':');
console.log(parsed); // 输出:{ name: 'John', age: '30', city: 'New York' }
在这个例子中,使用了分号 (;
) 作为键值对的分隔符,冒号 (:
) 作为键和值之间的分隔符。
2.2 querystring.stringify()
querystring.stringify()
用于将对象序列化为查询字符串。
语法:
querystring.stringify(obj[, sep[, eq[, options]]])
obj
: 要序列化的对象。sep
: 可选,指定键值对的分隔符,默认为'&'
。eq
: 可选,指定键和值之间的分隔符,默认为'='
。options
: 可选,包含以下属性:encodeURIComponent
: 编码查询字符串中字符的函数,默认为encodeURIComponent
。
示例:
const querystring = require('querystring');
const obj = { name: 'John', age: 30, city: 'New York' };
const queryString = querystring.stringify(obj);
console.log(queryString); // 输出: 'name=John&age=30&city=New+York'
在这里,querystring.stringify()
将对象 { name: 'John', age: 30, city: 'New York' }
序列化为查询字符串 name=John&age=30&city=New+York
。
自定义分隔符:
const obj = { name: 'John', age: 30, city: 'New York' };
const queryString = querystring.stringify(obj, ';', ':');
console.log(queryString); // 输出: 'name:John;age:30;city:New+York'
在这个例子中,使用了分号 (;
) 作为键值对的分隔符,冒号 (:
) 作为键和值之间的分隔符。
2.3 querystring.escape()
querystring.escape()
用于编码查询字符串中的特殊字符。该函数使用 encodeURIComponent
编码 URL 中的组件。
语法:
querystring.escape(str);
str
: 要编码的字符串。
示例:
const querystring = require('querystring');
const encoded = querystring.escape('New York');
console.log(encoded); // 输出: 'New%20York'
在这里,querystring.escape()
将字符串 New York
编码为 New%20York
。
2.4 querystring.unescape()
querystring.unescape()
用于解码查询字符串中被编码的特殊字符。该函数使用 decodeURIComponent
来解码 URL 组件。
语法:
querystring.unescape(str);
str
: 要解码的字符串。
示例:
const querystring = require('querystring');
const decoded = querystring.unescape('New%20York');
console.log(decoded); // 输出: 'New York'
在这里,querystring.unescape()
将 New%20York
解码为 New York
。
3. Query Strings 使用示例
以下是一个综合示例,展示了如何使用 querystring
模块的各个方法来解析和生成查询字符串:
const querystring = require('querystring');
// 将查询字符串解析为对象
const queryString = 'name=John&age=30&city=New+York';
const parsed = querystring.parse(queryString);
console.log(parsed); // 输出:{ name: 'John', age: '30', city: 'New York' }
// 将对象序列化为查询字符串
const obj = { name: 'Jane', age: 25, city: 'Los Angeles' };
const stringified = querystring.stringify(obj);
console.log(stringified); // 输出: 'name=Jane&age=25&city=Los+Angeles'
// 自定义分隔符的解析与序列化
const customQueryString = 'name:John;age:30;city:New York';
const customParsed = querystring.parse(customQueryString, ';', ':');
console.log(customParsed); // 输出:{ name: 'John', age: '30', city: 'New York' }
const customObj = { name: 'Jane', age: 25, city: 'Los Angeles' };
const customStringified = querystring.stringify(customObj, ';', ':');
console.log(customStringified); // 输出: 'name:Jane;age:25;city:Los+Angeles'
// 编码与解码 URL 组件
const encoded = querystring.escape('Los Angeles');
console.log(encoded); // 输出: 'Los%20Angeles'
const decoded = querystring.unescape('Los%20Angeles');
console.log(decoded); // 输出: 'Los Angeles'
4. 总结
querystring
模块是用于处理 URL 查询字符串的工具,提供了解析与生成查询字符串的简单方法。尽管已被标记为过时,但在处理旧项目或简单应用时仍然非常有用。对于新的应用,推荐使用更现代的 URLSearchParams
API,它具备更好的功能和更强的兼容性。