本文深入解析Node.js中querystring模块的核心功能,涵盖parse与stringify方法的参数配置、自定义分隔符及编码处理。通过代码示例演示如何解析GET请求URL参数,以及利用data和end事件拼接处理POST缓冲区数据,帮助开发者掌握Node.js中获取和处理HTTP请求数据的标准实践。
在前端与后端开发中,处理URL参数是常见应用场景。Node.js提供的querystring模块专门用于处理查询字符串(query strings)。本文将对该模块的功能进行详细解析。
var querystring = require('querystring');
/*
{ unescapeBuffer: [Function],
unescape: [Function: qsUnescape],
escape: [Function],
encode: [Function],
stringify: [Function],
decode: [Function],
parse: [Function] }
*/
console.log(querystring);
序列化
querystring.parse(str[, sep[, eq[, options]]])
querystring.parse()函数可将URL查询字符串(str)解析为键值对集合,其接收参数如下:
str <String> 待解析的URL查询字符串。
sep <String> 用于分隔键值对的子字符串,默认为 '&'。
eq <String> 用于分隔键与值的子字符串,默认为 '='。
options <Object>
decodeURIComponent <Function> 解码百分号编码字符时使用的函数,默认为 querystring.unescape()。
maxKeys <number> 指定解析的最大键数量,默认为 1000。若设为 0 则取消限制。
var querystring = require('querystring');
var str = 'foo=bar&abc=xyz&abc=123';
console.log(querystring.parse(str));//'{ foo: 'bar', abc: [ 'xyz', '123' ] }'
第二个参数用于界定查询字符串中键值对的分隔符。
var querystring = require('querystring');
var str = 'foo=bar&abc=xyz&abc=123';
console.log(querystring.parse(str,'a'));//{ foo: 'b', 'r&': '', bc: [ 'xyz&', '123' ] }
第三个参数用于界定查询字符串中键与值之间的分隔符。
var querystring = require('querystring');
var str = 'foo=bar&abc=xyz&abc=123';
console.log(querystring.parse(str,'&','c'));//{ 'foo=bar': '', ab: [ '=xyz', '=123' ] }
[注意] querystring.parse()返回的对象并非继承自JavaScript的Object。因此,obj.toString()、obj.hasOwnProperty()等典型Object方法未定义且不可用。
默认情况下,查询字符串中的百分号编码字符被视为UTF-8编码。若使用其他字符编码,需指定decodeURIComponent选项。
var querystring = require('querystring');
//{ w: '����', foo: 'bar' }
console.log(querystring.parse('w=%D6%D0%CE%C4&foo=bar', null, null,{ decodeURIComponent: 'gbkDecodeURIComponent' }));
querystring.stringify(obj[, sep][, eq][, options])
querystring.stringify()是parse()的逆向操作,通过遍历对象的自有属性,将给定obj转换为URL查询字符串,参数如下:
obj <Object> 需序列化为URL查询字符串的对象。
sep <String> 用于分隔键值对的子字符串,默认为 '&'。
eq <String> 用于分隔键与值的子字符串,默认为 '='。
options
encodeURIComponent <Function> 将URL不安全字符转换为百分号编码时使用的函数,默认为 querystring.escape()。
var querystring = require('querystring');
//'foo=bar&baz=qux&baz=quux&corge='
console.log(querystring.stringify({ foo: 'bar', baz: ['qux', 'quux'], corge: '' }));
var querystring = require('querystring');
//'foo:bar;baz:qux'
console.log(querystring.stringify({foo: 'bar', baz: 'qux'}, ';', ':'));
queryString模块编码
querystring.escape(str)
querystring.escape()对给定str执行URL百分号编码,行为与encodeURIComponent一致。
该方法主要供querystring.stringify()内部使用,通常不直接调用。其对外开放旨在允许用户通过赋值自定义函数来重写编码实现。
var querystring = require('querystring');
console.log(encodeURIComponent('测试'));//%E6%B5%8B%E8%AF%95
console.log(querystring.escape('测试'));//%E6%B5%8B%E8%AF%95
querystring.unescape(str)
querystring.unescape()对给定str中的URL百分号编码字符执行解码。
该方法主要供querystring.parse()内部使用,通常不直接调用。其对外开放旨在允许用户通过赋值自定义函数来重写解码实现。
querystring.unescape()默认使用JavaScript内置的decodeURIComponent()进行解码。
var querystring = require('querystring');
console.log(decodeURIComponent('%E6%B5%8B%E8%AF%95'));//'测试'
console.log(querystring.unescape('%E6%B5%8B%E8%AF%95'));//'测试'
Node.js获取GET数据
GET请求的数据保存在URL中。
http://127.0.0.1:8080/home/test?a=1&b=2
var http = require('http');
var url = require('url');
var querystring = require('querystring');
http.createServer(function(req,res){
var urlObj = url.parse(req.url);
var query = urlObj.query;
var queryObj = querystring.parse(query);
console.log(req.url);//'/home/test?a=1&b=2'
console.log(query);//'a=1&b=2'
console.log(queryObj);//{ a: '1', b: '2' }
}).listen(8080);
Node.js获取POST数据
POST请求数据写入缓冲区,需通过request的data事件和end事件进行数据拼接处理。
var http = require('http');
var url = require('url');
var querystring = require('querystring');
http.createServer(function(req,res){
var str = '';
req.on('data', function(thunk){
str += thunk;
});
req.on('end', function(){
console.log(str);//'name=a&email=b%40b.com'
var queryObj = querystring.parse(str);
console.log(queryObj);//{ name: 'a', email: 'b%40b.com' }
});
更多关于Node.js获取GET,POST数据的文章请点击下面的相关链接