Node.js开发实战详解之学习笔记(一)

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的功能目标总算是达到了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值