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中有所不同。无论是ajaxonload
响应还是eventemitteronend
值,都是关于从异步回调中“返回”值。解决方案(回调、承诺)完全相同。@Bergi文章说示例代码在旧版本的node中工作,而不是在新版本中工作。它显示出不同。我没有看到类似的ajax行为。呃,我很确定它也不能与节点v0.10一起工作(request
几乎从来都不是同步的,就像sjax一样)。如果您将重点()您的问题放在为什么它与0.10一起工作,而不是与0.12一起工作上,我可以重新打开它,但目前它只是问如何使它工作,dupeMaybe回答说这是一个更好的副本: