此服务器代码是错误的:
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); }); },


