如何在方法中返回节点流请求数据?

时间:2015-07-30 17:52:10

标签: javascript node.js asynchronous

我有以下示例代码。

var getPostedData =  function (request) {
    var qs = require('querystring');
    var body = '';
    request.on('data', function(chunk) {
        body += chunk.toString();
    });     
    return qs.parse(body);
};
getPostedData();

但是连接请求数据以流或多个数据包的形式出现。它不能像节点 v0.12 中的上述代码一样返回。示例代码将与节点 v0.10 一起使用。

多个数据包的一个解决方案是在请求对象上侦听end事件发射。

var getPostedData =  function (request) {
        var qs = require('querystring');
        var body = '';
        request.on('data', function(chunk) {
            body += chunk.toString();
        }).on('end', function() {
            //Here body will have multiple data packets
            //return qs.parse(body);
        });     
        return qs.parse(body);
    };
    getPostedData();

但是由于异步性,我们无法获得返回值。 如何在函数/方法中返回完整的多个数据块?

1 个答案:

答案 0 :(得分:1)

您只需添加一个回调函数即可知道在异步中完成作业的时间。

var getPostedData =  function (request, callback) {
    var qs = require('querystring');
    var body = '';
    request.on('data', function(chunk) {
        body += chunk.toString();
    }).on('end', function() {
        callback(null, qs.parse(body));
    }).on('error' function(err){
        callback(err);
    });
};

router.post("/example", function(req, res, next){
  getPostedData(req, function(err, body){
    if(err) return next(err);
    req.body = body;
    next();
  });
}, function(req, res){
  console.log(req.body);
  // Do you favor
});

在那里,我将getPostData功能用作/example路由器上的中间件。