如何阻止中间件链?

时间:2016-12-02 00:39:33

标签: node.js express

如果出现错误,如何正确结束中间件链?

在我的代码中我有

    if (someProblem) {
        res.status(statuscode).json({message: 'oops'});
        return;
    }

然而,在此之后链中的中间件不断被调用给我Can't set headers after they are sent错误。

3 个答案:

答案 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');
});