Express 3错误中间件未被调用

我正在尝试为我的快速应用程序安装error handling,并遇到以下问题。

我定义了一个错误中间件,并将其添加为最后的中间件:

// error handler app.use(function(err, req, res, next) { console.log('JUST TESTING. ERROR HANLDER HAS BEEN CALLED...'); next(err); }); 

现在我希望这个中间件在发生错误时被调用:

 app.get('/datenschutz', function(req, res, next){ return next(new Error('Just testing')); // handle everything here }); 

但是我的中间件从来没有被调用! 浏览器不会显示堆栈跟踪。 这似乎有另一个中间件,捕捉这个错误和处理它之前,我可以做任何事情。

问题是,我不知道这个中间件可以被定义的地方,因为我有一个非常简单的设置:

 // setup ssl for local testing var app = express(); app. use(express.static(__dirname + '/public')). use(express.bodyParser()). use(express.cookieParser()); 

为什么我的error handling中间件不被调用? 这个“默认”error handling发生在哪里?

谢谢!

*编辑*我看到中间件确实工作。 但是,如果我从另一个中间件函数调用它,则是这种情况。 但是,如果错误发生在定义为快速路由(GET,POST等)的函数中,则不会被调用。 这很奇怪。 如果我将错误中间件添加到路由callback中,那么它将起作用:

 app.get('/testError', function(req, res, next){ return next(new Error('Just testing')); // handle everything here }, function(err,req,res,next) { console.log('This error handler is called!!'); return next(); }); 

*编辑2 – find可接受的解决方法**我很惊讶它必须这样做。 因为我已经阅读了许多有关error handling的条目/问题,并没有发现这种可能性。 但是,似乎如果路由callback内部错误中间件处理程序中的错误将不会将其提取出来。 您将需要在路由级别定义error handling程序。

 app.all('*', function(err,req,res,next) { console.log('This is a global error handler at route level....'); return next(err); }); 

       

网上收集的解决方案 "Express 3错误中间件未被调用"

我也有这个问题,但我不明白为什么它不工作,即使我在app.user(app.router)之后设置我的error handling程序。 事实certificate,我已经有一个我不知道的error handling程序。

具体来说,如果您使用express cli来生成像我一样的应用程序,它会自动添加在这个:

 if ('development' == app.get('env')) { app.use(express.errorHandler()); } 

不幸的是,我添加了一些中间件到我的应用程序,从而掩盖了这个声明,从而阻止我的自定义error handling程序被调用。

只要删除,然后它应该正常工作。

在一个侧面说明,我应该提到,原来的解决scheme仍然工作 – 即使与app.use(express.errorHandler())

 app.all('*', function(err,req,res,next) { console.log('This is a global error handler at route level....'); return next(err); }); 

编辑2(sabtioagoIT)的作品。 但是对于那些错过了它的人来说,emostar的解决scheme也是可行的。 我明白将error handling“使用”调用移动到最后,但似乎有一个更容易的选项,如emosterbuild议,使用app.router(在error handling“使用”调用之前)。

从Express 4文档更新了Express 4用户的答案。 看下面的文档的例子。 请注意, app.router已被弃用,不再使用。 我还添加了一个虚拟路由来明确sorting:

“最后定义error handling中间件,在其他app.use()和路由调用之后;例如:

 var bodyParser = require('body-parser'); app.use(bodyParser()); app.get('/', function(req, res) { res.send('hello world'); }) app.use(function(err, req, res, next) { // logic });