Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.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
Javascript 如何使用nodeJS express中的next干净地退出第二级函数?_Javascript_Node.js_Express - Fatal编程技术网

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处理程序。事实上,它解决了我的问题。如果您想把它写下来作为一个答案,我将验证它。谢谢