【问题标题】:How to trigger router error handler instead of default error handler in expressjs如何在expressjs中触发路由器错误处理程序而不是默认错误处理程序
【发布时间】:2014-06-08 16:32:09
【问题描述】:

我的 express 应用使用默认的 JSON 正文解析器:

app.use(bodyParser.json());

app.js 文件的下方,我有自己的路由器来构建 REST API 路由:

var api = require('./routes/api/index');
...
app.use('/api', api);

这个路由器有一个错误处理程序,除其他外:

router.use(function (err, req, res, next) {
  debugger;
  res.status(err.code ? getParseErrorStatus(err.code) : res.status || 500).send({
    error: err.message
  });
});

每当 bodyParser 在解析请求正文时抛出错误时,我都会调用我的通用快速错误处理程序:

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
  app.use(function (err, req, res, next) {
    debugger;
    res.status(err.status || 500);
    res.render('error', {
      message: err.message,
      error: err
    });
  });
}

即使对 API 路由器捕获的对 /api/* URL 的调用也是如此。

如果 URL 是 API URL,我如何使 JSON 解析错误(由链中的中间件捕获)调用我在 API 路由器中定义的错误处理程序,而不是总是调用通用错误处理程序?

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    错误处理程序在同一路由器堆栈级别调用。由于bodyParser.json()是在main/root/app层执行的,它会在main/root/app层寻找第一个error handler。

    因此,如果您想处理 API 正文解析错误,则必须将 bodyParser.json() 中间件移动到需要正文解析的每个路由/路由器。

    【讨论】:

      猜你喜欢
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      • 2013-06-19
      • 2019-03-15
      • 2016-06-02
      • 1970-01-01
      相关资源
      最近更新 更多