Express.js:从路由处理函数调用下一个(错误)是否调用全局错误处理中间件?

问题描述:

比方说,我已经定义了以下中间件和路由处理程序:Express.js:从路由处理函数调用下一个(错误)是否调用全局错误处理中间件?

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); 
}); 

Doe的错误处理中间件被调用?

如果不是,将错误处理中间件如果

  • 错误处理中间件被下面的路由处理程序定义的叫什么?我用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]); 

我现在有点糊涂了......

中间件的顺序,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]); 

是actualy不好,因为你需要在每一个航线使用它

好:

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); 
+0

啊,所以未来(错误)将进入错误处理中间件,即使它没有在路线中定义“下一个”是什么? – Alex

+0

对不起,这是一个错误,'next'必须在回调函数app.get('/ test',function(req,res,next)'否则会出错'“next”不是函数' – Molda

+0

''下一个(错误)''会用''req,res,next''签名忽略中间件,并用'err,req,res,next''签名直接进入下一个中间件? – Alex