Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js res.end()在承诺完成之前执行_Node.js_Asynchronous - Fatal编程技术网

Node.js res.end()在承诺完成之前执行

Node.js res.end()在承诺完成之前执行,node.js,asynchronous,Node.js,Asynchronous,我的基本POST API调用数据库,首先对用户进行身份验证,如果提供的产品是真实的,则调用authentic。但在productValidation完成之前,res.end()正在执行 作为输出,我得到:: “已验证对象” “停止res” “已验证对象” 然而,我试图验证每个cartItem并将其添加到数据库中,然后才向客户端发送成功响应 const express=require(“express”); 常量app=express(); const router=express.router(

我的基本POST API调用数据库,首先对用户进行身份验证,如果提供的产品是真实的,则调用authentic。但在productValidation完成之前,res.end()正在执行

作为输出,我得到:: “已验证对象” “停止res” “已验证对象”

然而,我试图验证每个cartItem并将其添加到数据库中,然后才向客户端发送成功响应

const express=require(“express”);
常量app=express();
const router=express.router();
var connection=require(“../../database/serverConnector”);
路由器.get(“/:userId)”,(req,res,next)=>{
connection.query(
“从购物车项目中选择*作为c内部连接产品作为c.product\u id=p.id上的p,其中用户\u id=?”,
[req.params.userId],
函数(错误、结果、字段){
如果(错误)抛出错误;
否则{
console.log(“查询用户购物车”+req.params.userId);
资源状态(200)。发送(结果);
}
}
);
});
router.post(“/:userId”),userValidate,(req,res,next)=>{
多产品验证(req、res、next)。然后(函数(数据){
res.end();
console.log(“停止res”);
});
//.catch(错误){
//console.log(错误);
// }
});
功能userValidate(请求、恢复、下一步){
connection.query(
“从id=?”的用户中选择*”,
[req.params.userId],
函数(错误、用户、字段){
如果(错误){
res.status(500).json({
消息:error.sqlMessage,
});
}否则{
if(user.length==0){
res.status(404).json({
消息:“未找到ID为“+req.params.userId”的用户,
});
}else next();
}
}
);
}
功能多产品验证(req、res、next){
返回新承诺(功能(解决、拒绝){
请求正文cartItems.forEach((项目,i)=>{
productValidate(项目、请求、恢复、下一步)。然后(功能(数据){
解析(数据);
console.log(“已验证对象”);
//next();
});
});
});
}
功能productValidate(项目、需求、资源、下一步){
返回新承诺(功能(解决、拒绝){
connection.query(
“从id=?”的产品中选择*”,
[项目.产品编号],
功能(错误、产品、字段){
如果(错误){
res.status(500).json({
消息:error.sqlMessage,
});
}否则{
if(product.length==0){
res.status(404).json({
消息:“找不到ID为“+item.Product\u ID”的产品,
});
决议(假);
}否则{
connection.query(
“插入购物车项目(产品id、用户id、大小、数量)值(?,,?,?)”,
[item.product_id,req.params.userId,item.size,item.quantity],
函数(错误、结果、字段){
如果(错误){
res.status(500).json({
消息:error.sqlMessage,
});
}否则{
res.statusText=
“为用户添加到购物车的项目”+req.params.userId;
决心(正确);
}
}
);
}
}
}
);
});
}
module.exports=路由器;

因此,这里发生的情况是,在完成所有产品的处理之前,您正在
multipleProductValidation
中调用
resolve

像这样的事情应该可以解决你的问题

  function multipleProductValidation(req, res, next){
  return new Promise(function(resolve, reject) {
    let promiseArr = req.body.cartItems.map(item => productValidate(item, req, res, next))
    Promise.all(promiseArr).then(values => resolve(values))
  }
  )}

multipleProductValidation()
中,您在
.forEach()
循环中调用
resolve()
,以便在任何其他迭代完成之前,在循环的第一次迭代中解析您的承诺。仅当循环的所有迭代都完成时,才需要调用resolve。