Express 3错误中间件未被调用

时间:2012-11-02 15:18:38

标签: node.js 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());

为什么我的错误处理中间件没有被调用? 这种'默认'错误处理在哪里发生?

谢谢!

*编辑* 我看到中间件确实在工作。但是,如果我从另一个中间件函数调用它,就是这种情况。 但是,如果在定义为快速路由(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 - 找到可接受的解决方法** 我很惊讶它必须这样做。因为我已经阅读了许多有关快递错误处理的条目/问题,并且从未发现过这种可能性。 然而,似乎如果错误发生在路由回调中,常规错误中间件处理程序将无法获取它。您需要在路由级别定义错误处理程序。

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

4 个答案:

答案 0 :(得分:3)

我也遇到了这个问题,但即使我在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);
});

答案 1 :(得分:2)

针对Express 4用户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
});

"

答案 2 :(得分:1)

EDIT 2(sabtioagoIT)有效。但是对于那些错过它的人来说,emostar的解决方案也有效。 我理解将错误处理'use'调用移到最后,但似乎有一个更容易的选项,因为emoster建议使用app.router(在错误处理'use'调用之前)。

答案 3 :(得分:0)

而不是制造

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

您可以安装express-async-errors

然后做

app.get('/datenschutz', function(req, res){
       throw new Error('Just testing');
    });

它按预期工作