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

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

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

error handling中间件得到调用吗?

如果不是的话,error handling中间件会被调用

  • error handling中间件是在路由处理器之下定义的?
  • 我使用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'...

error handling程序应该总是在你的代码的底部,所以如果在某个路由处理程序中出现错误,你将调用next(error) ,error handling程序将响应客户端的消息,如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);