Express错误处理 - 获取状态码

4
如果我在express中定义错误处理中间件,代码可能是这样的:

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

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

谢谢,
Ari

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属性的精细命名的包装器类。我在几个项目中都使用了这种方法。

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)
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接