我正在尝试为我的express应用程序设置错误处理,但遇到了以下问题。
我定义了一个错误中间件,并将其添加为最后一个中间件:
// 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());
为什么我的错误处理中间件没有被调用?这种“默认”错误处理发生在哪里?
谢谢!
* EDIT *我看到中间件确实在工作。但是,如果我从另一个中间件函数调用它,情况就是这样。但是,如果错误发生在定义为快速路由(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();
});
* EDIT 2-找到可接受的解决方法**我很惊讶必须这样做。因为我已经读了很多关于express中错误处理的条目/问题,但从来没有发现提到过这种可能性。但是,似乎如果在路由回调中发生错误,那么中间件处理程序将不会发现它。您将需要在路由级别定义一个错误处理程序。
app.all('*', function(err,req,res,next) {
console.log('This is a global error handler at route level....');
return next(err);
});
发布于 2014-02-16 17:08:07
我也有这个问题,但是我不知道为什么它不能工作,即使我在app.user(app.router)
之后设置了我的错误处理程序。事实证明,我已经有了一个我不知道的错误处理程序。
具体地说,如果您像我一样使用express cli生成一个应用程序,它会自动添加以下内容:
if ('development' == app.get('env')) {
app.use(express.errorHandler());
}
对我来说不幸的是,我在我的应用程序中添加了更多的中间件,从而模糊了这条语句,从而阻止了我的自定义错误处理程序被调用。
只需移除它,它就会正常工作。
顺便说一句,我应该提到最初的解决方案仍然有效-即使使用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);
});
发布于 2015-03-05 13:34:52
更新了Express4用户from the Express 4 docs的答案。参见下面文档中的示例。请注意,app.router
已被弃用,不再使用。我还添加了一个虚拟路由,以使排序更清晰:
“最后,在其他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
});
“
发布于 2013-01-30 21:41:38
编辑2 (sabtioagoIT)起作用。但对于那些错过它的人来说,emostar的解决方案也是有效的。我理解将错误处理的' use‘调用移到最后,但似乎有一个更简单的选择,就像emoster建议的那样,使用app.router (在错误处理的'use’调用之前)。
https://stackoverflow.com/questions/13198129
复制相似问题