Express.js:从路由处理程序调用next(错误)是否调用全局错误处理中间件?

时间:2016-11-13 15:04:49

标签: javascript node.js express error-handling routes

我们说我已经定义了以下中间件和路由处理程序:

app.use(function(err,req,res,next) {
    res.status(500).send('Something broke!');
});

app.get('/test',function(req,res) {
    //some error happens here, and ther "error" object is defined
    next(error);
});

是否会调用错误处理中间件?

如果没有,如果

,是否会调用错误处理中间件
  • 错误处理中间件是在路由处理程序下面定义的吗?
  • 我使用throw error;代替next(error);
  • 上述两种情况都属实?

或者我应该这样做:

//route.js
module.exports=function(req,res,next) {
    //error happens here
    next(error);
}

//errorHandler.js
module.exports=function(err,req,res,next) {
    res.status(500).send('Something broke!');
}

//app.js
var route=require('route');
var errorHandler=require('erorHandler');
app.get('/test',[route,errorHandler]);

我现在有点困惑......

1 个答案:

答案 0 :(得分:2)

中间件,app.get,app.post等的顺序事项,它们按照在代码中添加的顺序进行处理。

所以当你像你一样定义它时

app.use(function(err,req,res,next) {
    res.status(500).send('Something broke!');
});

app.get('/test',function(req,res) {
    //some error happens here, and ther "error" object is defined
    next(error);
});

第一个中间件将捕获所有请求并返回状态500,因此它永远不会到达app.get('test'...

错误处理程序应始终位于代码的底部,因此如果某个路由处理程序中出现错误,则调用next(error),错误处理程序将使用您的res.status(500).send('Something broke!');之类的消息响应客户端

这个

app.get('/test',[route,errorHandler]);

实际上很糟糕,因为你需要在每条路线中使用它

好:

app.get('/test',function(req,res,next) {
    //some error happens here, and ther "error" object is defined
    next(error);
});

app.use(function(err,req,res,next) {
    res.status(500).send('Something broke!');
});

app.listen(8000);