我正在尝试为我的快速应用程序设置错误处理并遇到以下问题。
我定义了一个错误中间件并将其添加为最后一个中间件:
// 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());
为什么我的错误处理中间件没有被调用?这种“默认”错误处理发生在哪里?
谢谢!
* 编辑 * 我看到中间件确实在工作。但是,如果我从另一个中间件函数调用它,就会出现这种情况。但是,如果错误发生在定义为快速路由(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();
});
* 编辑 2 - 找到可接受的解决方法 ** 我很惊讶它必须以这种方式完成。正如我在 express 中阅读了许多有关错误处理的条目/问题,但从未发现提到过这种可能性。但是,如果在路由回调中发生错误,则常规错误中间件处理程序似乎不会拾取它。您将需要在路由级别定义错误处理程序。
app.all('*', function(err,req,res,next) {
console.log('This is a global error handler at route level....');
return next(err);
});