viewCartPost: function(req, res){
var data = JSON.parse(req.body.data);
console.log(data);
var keys = Object.keys(data);
//console.log(keys);
for(var i = 0; i<keys.length; i++){
var productId = keys[i];
Product.find({productId: productId}).select({productId : 1, addProductGroupName: 1, productName: 1, productPrice: 1, productDescription: 1, filePath: 1}).exec(function(err, cartProducts){
if(err){
console.log(err);
res.send("error");
}else{
res.send("Success^^^"+cartProducts);
}
});
console.log(productId);
}
},
您有res.send("Success^^^"+cartProducts);
一个for
循环。这意味着您要多次调用它。这意味着您尝试为此请求发送多个响应,并且触发您看到的错误。这是错误的服务器代码。对于任何给定的请求,您只需发送一个响应。
在建议哪种代码可以最好地解决此问题之前,我必须先了解所需的单个响应是什么。如果您打算执行这样的多个异步操作,并且想知道所有这些操作何时完成,则必须编写代码来跟踪它们,并在所有操作完成时得到通知,然后发送一个且只有一个响应。
可以使用计数器手动执行此操作,并使用一些代码来递增和检查计数器,也可以通过切换到使用Promise来跟踪异步操作并Promise.all()
在所有异步操作都完成时通知您,从而以更易于管理的方式来完成此操作。完成。
当您在此功能中具有多个键时,要发送的单个响应是什么?
我自己对猫鼬不太了解,但是.exec()
在最近的版本中,猫鼬会返回一个承诺,因此我们可以使用它来协调多个异步数据库操作,如下所示:
viewCartPost: function(req, res){
var data = JSON.parse(req.body.data);
console.log(data);
var keys = Object.keys(data);
//console.log(keys);
var promises = [];
for(var i = 0; i<keys.length; i++){
var productId = keys[i];
promises.push(Product.find({productId: productId}).select({productId : 1, addProductGroupName: 1, productName: 1, productPrice: 1, productDescription: 1, filePath: 1}).exec());
}
Promise.all(promises).then(function(results) {
// you may have to reorganize results to be exactly what you want
// to return to the client
res.json(results);
}).catch(function(err){
console.error("viewCartPost", err);
res.sendStatus(500);
});
},