求问node express 捕获错误的机制

在express生成的标准模板中,发生错误(404和其他错误)时,为什么会执行以下代码?当使用try catch时,catch会触发通用的error handler方法?

// catch 404 and forward to error handler
app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

// error handler
app.use(function(err, req, res, next) {
    // set locals, only providing error in development
    res.locals.message = err.message;
    res.locals.error = req.app.get('env') === 'development' ? err : {};

    // render the error page
    res.status(err.status || 500);
    res.render('error');
});
阅读 2.4k
1 个回答

我们来看下文档:

如果将任何项传递到 next() 函数(除了字符串 'route'),那么 Express 会将当前请求视为处于错误状态,并跳过所有剩余的非错误处理路由和中间件函数。

因此示例代码里调用 next(err) 将使得 Express 调用错误处理中间件。至于如何判断一个中间件是不是错误处理中间件?

Express 会对中间件 fn 的参数个数进行判断,如果参数个数不等于 4 则认为不是错误处理中间件,则继续调用next(err),这样就会进入到下一个中间件函数,继续进行参数个数判断,如此方式一直到某个中间件函数的参数个数是 4,就认为找到了错误处理中间件,然后执行此中间件函数。

另外,使用 try catch 会不会触发错误处理中间件取决于你是否调用 next(err)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题