异步在最后一项之前调用回调?
Async is calling callback before last item?
我有一个处理对象列表的 async.eachSeries()
函数。在列表之后我想要一个 res.send()
函数,这样我就可以将结果发送回前端。
但是我得到了
'Can't set headers after they are sent'
res.send()
行出错,看起来是在列表完全处理之前调用了该函数。
module.exports.createOrder = function(req,res){
console.log("CreateOrder");
var orderDescription = "";
var payId = new ObjectId(); //create one id, to pay multiple orders at one time
var shopList = groupByShop(req.body.cart);
var orders = [];
var result = {};
console.log("before async");
//the cart is now sorted by shop, now we can make orders for each shop
async.eachSeries(Object.keys(shopList), function(key, callback){
console.log("in async");
var shop = shopList[key];
console.log("before saveOrder");
saveOrder(payId, shop, key, req.body, req.user, function(err, newOrder){
console.log("in saveorder");
if(err){
console.log("Err", err);
callback(err);
}else{
console.log("order saved");
orders.push(newOrder);
callback();
}
})
}, function(err){
if(err){
console.log("One or more orders are not saved:", err);
return res.status(400).json(err);
}else{
console.log("All orders are processed");
result = {
message: 'OK',
order: {
payId: orders[0].payId
}
};
return res.send(200).json(result);
}
})
}
这里出了什么问题?目前在“shopList
”中使用一个对象进行测试,并且所有日志行都在服务器控制台中可见。
当我删除该行时,该函数工作正常,但是,当然,他没有发送任何结果。我还尝试将行移到函数之外,但这当然会再次导致空 result{}
和函数完成前的发送。
res.send(200)
将发送内容为“200”的 HTML 响应 - 你想要做的是 res.status(200).json(result)
尽管 res.json(result)
也应该可以正常工作。
我有一个处理对象列表的 async.eachSeries()
函数。在列表之后我想要一个 res.send()
函数,这样我就可以将结果发送回前端。
但是我得到了
'Can't set headers after they are sent'
res.send()
行出错,看起来是在列表完全处理之前调用了该函数。
module.exports.createOrder = function(req,res){
console.log("CreateOrder");
var orderDescription = "";
var payId = new ObjectId(); //create one id, to pay multiple orders at one time
var shopList = groupByShop(req.body.cart);
var orders = [];
var result = {};
console.log("before async");
//the cart is now sorted by shop, now we can make orders for each shop
async.eachSeries(Object.keys(shopList), function(key, callback){
console.log("in async");
var shop = shopList[key];
console.log("before saveOrder");
saveOrder(payId, shop, key, req.body, req.user, function(err, newOrder){
console.log("in saveorder");
if(err){
console.log("Err", err);
callback(err);
}else{
console.log("order saved");
orders.push(newOrder);
callback();
}
})
}, function(err){
if(err){
console.log("One or more orders are not saved:", err);
return res.status(400).json(err);
}else{
console.log("All orders are processed");
result = {
message: 'OK',
order: {
payId: orders[0].payId
}
};
return res.send(200).json(result);
}
})
}
这里出了什么问题?目前在“shopList
”中使用一个对象进行测试,并且所有日志行都在服务器控制台中可见。
当我删除该行时,该函数工作正常,但是,当然,他没有发送任何结果。我还尝试将行移到函数之外,但这当然会再次导致空 result{}
和函数完成前的发送。
res.send(200)
将发送内容为“200”的 HTML 响应 - 你想要做的是 res.status(200).json(result)
尽管 res.json(result)
也应该可以正常工作。