【问题标题】:Express error handler inside router doesn't work路由器内部的快速错误处理程序不起作用
【发布时间】:2017-08-01 20:18:10
【问题描述】:

我有一个全局 error handling middleware 的快速应用程序,如下所示:

app.use(function (err, req, res, next) {
  console.error(err.stack)
  res.status(500).send('Something broke!')
})

现在,我重构了应用程序,使其拥有一个专用的router,仅用于错误处理和相关视图(应用程序向用户显示很好的错误消息,隐藏内部错误):

var express = require('express');
var app = express();

// add one or more routers that throw errors
var myRouter = express.Router();
router.get('/', function(req, res, next) {
     next(new Error('Internal error'));
});
// more handlers...

// ...and finally the new errors router
var errRouter = express.Router();
errRouter.use(function(err, req, res, next) {
  logError(err);
  renderNiceErrorView(err);
});

app.use(errRouter);

但是现在这个错误处理程序在路由器内部,它不再捕获错误。

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    问题是在路由错误时表示looks for a four parameter function,但是Router函数has only three(req, res, next)就像一个标准的中间件。

    因此,应直接在应用程序上声明一个包罗万象的错误处理程序:

    app.use(function (err, req, res, next) {
        // TODO: handle the error
    });
    

    这是expected 和known 行为:您可以在这些链接中找到更多信息和其他方式来构建您的代码。请仔细阅读。

    如果您想知道快速路由的工作原理,请使用 debug on 和 inspect 标志启动您的应用:

    DEBUG=express:* node --inspect index.js
    

    然后打开 Chrome 开发工具,将它们附加到您的进程中,在引发错误(或手动引发错误)的行上添加一个断点,然后 播放 带有步进、步进按钮。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-04
      • 1970-01-01
      • 2020-01-25
      • 2018-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多