我正在尝试为我的快递应用程序设置错误处理并遇到以下问题.
我定义了一个错误中间件并将其添加为最后一个中间件:
// error handler
app.use(function(err, req, res, next) {
console.log('JUST TESTING. ERROR HANLDER HAS BEEN CALLED...');
next(err);
});
Run Code Online (Sandbox Code Playgroud)
现在我希望每当发生错误时都会调用这个中间件:
app.get('/datenschutz', function(req, res, next){
return next(new Error('Just testing')); // handle everything here
});
Run Code Online (Sandbox Code Playgroud)
但是我的中间件永远不会被调用!然而,浏览器确实显示堆栈跟踪.这似乎有另一个中间件正在捕获此错误并在我可以对它做任何事情之前对其进行处理.
问题是我不知道可以定义这个中间件的位置,因为我有一个非常简单的设置:
// setup ssl for local testing
var
app = express();
app.
use(express.static(__dirname + '/public')).
use(express.bodyParser()).
use(express.cookieParser());
Run Code Online (Sandbox Code Playgroud)
为什么我的错误处理中间件没有被调用?这种"默认"错误处理在哪里发生?
谢谢!
*编辑* 我看到中间件确实在工作.但是,如果我从另一个中间件函数调用它,就是这种情况.但是,如果在定义为快速路由(GET,POST等)的函数内发生错误,则不会调用它.这很奇怪.如果我将我的错误中间件添加到路由回调中,那么它的工作原理如下:
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();
});
Run Code Online (Sandbox Code Playgroud)
*编辑2 - 找到可接受的办法** 我很惊讶它必须这样做.因为我已经阅读了许多有关快递错误处理的条目/问题,并且从未发现过这种可能性.然而,似乎如果错误发生在路由回调中,常规错误中间件处理程序将无法获取它.您需要在路由级别定义错误处理程序.
app.all('*', function(err,req,res,next) {
console.log('This is a global error handler at route level....');
return next(err);
});
Run Code Online (Sandbox Code Playgroud)
编辑 2 (sabtioagoIT) 有效。但对于那些错过的人来说,emostar 的解决方案也有效。我理解将错误处理“use”调用移到最后,但正如emoster建议的那样,似乎有一个更简单的选择,使用app.router(在错误处理“use”调用之前)。