如果出现错误,如何正确结束中间件链?
在我的代码中我有
if (someProblem) {
res.status(statuscode).json({message: 'oops'});
return;
}
然而,在此之后链中的中间件不断被调用给我Can't set headers after they are sent
错误。
答案 0 :(得分:4)
中间件本身不会发展。当您拨打next()
时,它只会转到链中的下一步,只要您不调用next()
,就不会执行下一步。
所以,如果您只是发送回复并返回(不调用next()
),那么您应该没有问题。
您在问题中显示的代码本身并不会导致您引用的错误消息,因此必须有更多内容表明您没有向我们显示该错误。
答案 1 :(得分:0)
如果您希望中间件不进入链的下一步但返回错误,则必须调用next(error)
回调。
这将调用错误处理程序中间件,您可以在其中操作错误并将其返回给客户端,如果这就是您想要的。
要实现自定义错误处理程序中间件,您可以使用handleError(err, req, res, next)(error, req, res, next)
答案 2 :(得分:0)
因此,您只需在创建实际服务器实例之前附加errorHandler(这是一个需要4个参数的函数)。
在应用中的任何位置,您现在只需使用var newError = new Error('my error message');
创建错误,然后将其传递给next
回调next(newError);
要在抛出错误后停止执行并且不发送响应两次,请使用return next (newError);
// example route
app.get('/test', function(req, res, next){
if (someProblem) {
var newError = new Error('oops');
return next(newError);
}
res.send('all OK - no errors');
});
// attach this errorHandler just before you create the server
app.use(function(error, req, res, next){
console.log(error);
res.status(500).json(error);
});
// this is where you create the server
var server = app.listen(4000, function(){
console.log('server started');
});