Javascript 如何使用nodeJS express中的next干净地退出第二级函数?
下面是我的样式化代码:Javascript 如何使用nodeJS express中的next干净地退出第二级函数?,javascript,node.js,express,Javascript,Node.js,Express,下面是我的样式化代码: 让_函数=(req,res,next)=>{ 允诺 .map(参数,(x)=>{ 返回得到承诺(x); },{并发:20} )。然后((值)=>{ 让reduceFunc=(acc,currV,currI)=>{ 如果(不好的事情){ 下一步(新错误(“发生了不好的事情”); 返回; }否则{ 返回acc; } }; 让result=values.reduce(reduceFunc,[]); res.send(结果); }).catch((错误)=>{ res.send(
让_函数=(req,res,next)=>{
允诺
.map(参数,(x)=>{
返回得到承诺(x);
},{并发:20}
)。然后((值)=>{
让reduceFunc=(acc,currV,currI)=>{
如果(不好的事情){
下一步(新错误(“发生了不好的事情”);
返回;
}否则{
返回acc;
}
};
让result=values.reduce(reduceFunc,[]);
res.send(结果);
}).catch((错误)=>{
res.send(err);
});
};
我的想法是运行一系列承诺,然后将得到的值减少到单个对象,然后将其发送回用户
当reduce函数中发生错误时,我希望将正确的错误发送回用户。但在我当前的设置中,node.js服务器失败,在我获得以下信息后必须重新启动:
_http_outgoing.js:494
throw new ERR_HTTP_HEADERS_SENT('set');
^
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
用户得到的错误不是我希望她看到的
如何确保我希望用户看到的错误被干净地输出,而不同时杀死服务器?出现错误的原因是调用
next
不会停止reduce函数的执行。reduce函数继续运行,最终res.send(results)
被调用。这会成为一个问题,因为下一个路由处理程序显然也在发送响应,但对于一个请求,只能发送一个响应,因此会出现错误
您没有在catch处理程序中调用next
这一事实表明您并不真正想使用next
。既然如此,您可以简单地抛出错误,以便拖动reduce函数的执行并调用catch处理程序
let the_function = (req, res, next) => {
Promise
.map(promises_params, (x) => {
return get_promise(x);
}, {concurrency: 20}
).then((values) => {
let reduceFunc = (acc, currV, currI) => {
if (something_bad) {
throw new Error("something bad happened");
} else {
return acc;
}
};
let result = values.reduce(reduceFunc,[]);
res.send(result);
}).catch((err) => {
res.send(err);
});
};
现在一个响应只发送一次。如果reduce函数完成时没有发生任何不好的事情,或者当一个错误发生时,它就会被发送,但决不能同时发送两个错误。为什么要对reduce函数中的错误使用next
,而不是catch处理程序中的错误使用next呢?在我看来,如果在这种情况下,您可以简单地抛出错误,它将调用catch处理程序。事实上,它解决了我的问题。如果您想把它写下来作为一个答案,我将验证它。谢谢