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

Javascript 如何在方法中返回节点流请求数据?,javascript,node.js,asynchronous,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(); 但是连接请求数

我有如下示例代码

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中的代码那样返回。示例代码将与nodev0.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();
但是在这里,由于异步的特性,我们无法获得返回值。
如何在一个函数/方法中返回完整的多个数据块?

您只需添加一个回调函数,就可以知道作业何时以异步方式完成

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
路由器上的中间件。

谢谢@green。我希望在没有回调的情况下以同步方式执行此操作。有什么方法可以这样做吗?@JustinJohn你可以使用,这是处理回调的另一种方法。那个么nodejs的本质已经是异步I/O,所以若并没有回调/承诺,你们就不能进行同步。@JustinJohn或者你们可以使用
async
(见这个答案)@JustinJohn我不建议在那个点上使用
async
getPostedData
),因为它已经在事件循环(promise),例如
on('data',callback)
@Bergi这不是链接问题的副本。这是相关的,不是完全相同的。需要处理的场景在服务器端javascript和客户端javascript中有所不同。无论是ajax
onload
响应还是eventemitter
onend
值,都是关于从异步回调中“返回”值。解决方案(回调、承诺)完全相同。@Bergi文章说示例代码在旧版本的node中工作,而不是在新版本中工作。它显示出不同。我没有看到类似的ajax行为。呃,我很确定它也不能与节点v0.10一起工作(
request
几乎从来都不是同步的,就像sjax一样)。如果您将重点()您的问题放在为什么它与0.10一起工作,而不是与0.12一起工作上,我可以重新打开它,但目前它只是问如何使它工作,dupeMaybe回答说这是一个更好的副本: