4

如果我用 express 定义错误处理中间件,如下所示:

app.use(function(err,req,res,next){
    // Do Stuff
});

如何获取错误的 HTTP 状态代码(或者我只是假设是 500)?

谢谢,
阿里

4

2 回答 2

8

简而言之,您的代码必须根据您在错误处理中间件中处理的特定错误来决定适当的错误代码。

此时不一定会生成 HTTP 状态代码。按照惯例,当我next(error)从中间件函数或路由器处理函数调用时,我会放置一个code属性,以便我的错误处理中间件可以执行res.status(err.code || 500).render('error_page', error);这些操作。但是,您是想将这种方法用于常见的 404 错误还是仅用于 5XX 服务器错误或其他什么,这取决于您。next在将错误传递给回调时,express 本身或大多数中间件中很少有东西会提供 http 状态代码。

举个具体的例子,假设有人试图在我的应用程序中使用我发现已经在数据库中注册的电子邮件地址注册一个用户帐户,我可能会这样做return next(new AlreadyRegistered());,AlreadyRegistered 构造函数会this.code = 409; //Conflict在错误实例上放置一个属性,以便错误处理中间件会发送 409 状态码。(对于这种“正常操作条件”错误,在正常路由链中使用错误处理中间件是否更好,这在设计方面是有争议的,但希望这个示例仍然是说明性的)。

仅供参考,我还推荐httperrors npm 模块,它提供了命名良好的包装类和一个statusCode属性。我在一些项目中使用它取得了很好的效果。

于 2013-03-10T01:23:09.823 回答
2

您可以尝试在路由中定义状态码:

app.get('/force-error', function(req, res) {
  res.status(400)
  next(new Error('Bad Request.'))
})

然后:

server.use(function serverErrorHandler (err, req, res, next) {
  const code = res.statusCode

  // if status 200 change to 500, otherwise get the defined status code
  res.status(code === 200 ? 500 : code)

  // check if it's a ajax request
  if (req.xhr)
    res.json({
      error: {
        status: res.statusCode,
        message: err.message,
        stack: err.stack,
      }
    })
  else
    next(err)
})
于 2019-04-16T22:24:32.960 回答