http_params中exports.POST的功能优化
最近在学习Node.js,入手了一本《Node.js开发实战详解》作为自己的启蒙书籍,基本就是按照书上的代码来熟悉各个章节的知识点,最近刚刚学习到第3章:Node.js的Web应用,其中3.1.5节提到一个公用模块(http_param.js)用于HTTP中获取POST和GET参数,这里将该模块的代码分享出来,如下所示:
var _req,_res,
url = require('url'),
querystring = require('querystring');
/**
* 初始化res和req参量
*/
exports.init = function(req,res){
_res = res;
_req = req;
}
/**
* 获取GET参数方法
*/
exports.GET = function(key){
var paramstr = url.parse(_req.url).query,
param = querystring.parse(paramstr);
return param[key] ? param[key] : '';
}
/**
* 获取POST参数方法
*/
exports.POST = function(key,callback){
var postData = '';
_req.addListener('data', function(postDataChunk){
postData += postDataChunk;
console.log('onData: '+ postData);
});
_req.addListener('end',function(){
console.log('onEnd');
//数据接受完毕,执行回调函数
var param = querystring.parse(postData);
var value = param[key] ? param[key] : '';
callback(value);
});
}
这里主要讨论一下关于exports.POST异步调用遇到的一些问题,下面是我的一部分调用代码:
httpParams.init(req,res);
var about,userid;
/********* 采用异步回调的方法 *********/
httpParams.POST('about',function(about){
console.log('about: ' + about);
httpParams.POST('userid',function(userid){
//将提交的about字段返回
console.log('about: ' + about + ', userid: ' + userid);
res.writeHead(200,{'Content-Type':'text/plain'});
res.end('about: ' + about + ', userid: ' + userid);
});
});
/********* 采用异步回调的方法 *********/
以上代码是通过exports.POST的方法获取由页面POST上来的userid和about两个参数,运行的结果日志如下:
从上面的日志输出可以看出来如下问题:
* req的data和end事件只再第一次调用时响应了;
* 第二次的回调因为没有触发data和end事件,所有没有执行,因此输出了about的值,而没有输出about和userid的值;
为了达到我们exports.POST本来的目的,我将http_params.js的公共模块做了如下两处修改:
* exports.init:
/**
* 初始化res和req参量
* 为_req增加两个变量_req.postData和_req.param
*/
exports.init = function(req,res){
_res = res;
_req = req;
_req.postData = '';
_req.param = undefined;
}
exports.POST:
/**
* 获取POST参数方法
*/
exports.POST = function(key,callback){
/* 根据_req.param判断,如果已经被解析过,则直接返回key对应的value值 */
if(_req.param!=undefined){
console.log('_req.param已被解析');
console.log(_req.param);
var value = _req.param[key] ? _req.param[key] : '';
callback(value);
return;
}
_req.addListener('data', function(postDataChunk){
_req.postData += postDataChunk;
console.log('onData: '+ _req.postData);
});
_req.addListener('end',function(){
console.log('onEnd');
//数据接受完毕,执行回调函数
_req.param = querystring.parse(_req.postData);
var value = _req.param[key] ? _req.param[key] : '';
callback(value);
});
}
修改以后执行的输出结果如下:
很好到这里exports.POST的功能目标总算是达到了。