快速错误处理 - 获取状态代码

时间:2013-03-09 23:58:37

标签: node.js error-handling express

如果我使用express这样定义错误处理中间件:

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

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

谢谢,
ARI

2 个答案:

答案 0 :(得分:6)

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

此时不一定会生成HTTP状态代码。按照惯例,当我从中间件函数或路由器处理函数调用next(error)时,我放置了一个code属性,因此我的错误处理中间件可以执行res.status(err.code || 500).render('error_page', error);或其他内容。但是,您是否要将此方法用于常见的404错误或仅5XX服务器错误或其他任何问题取决于您。在将错误传递给next回调时,表达本身或大多数中间件的内容很少会提供http状态代码。

对于一个具体的例子,假设有人试图在我的应用程序中注册一个用户帐户,并且我发现已经在数据库中注册了一个电子邮件地址,我可能会在return next(new AlreadyRegistered());中使用AlreadyRegistered构造函数放置一个{错误实例上的{1}}属性,因此错误处理中间件将发送409状态代码。 (对于这种“正常操作条件”错误,在正常路由链中使用错误处理中间件与仅处理此问题是否更好是设计方面的争论,但希望这个例子仍然是说明性的。)

仅供参考我还推荐httperrors npm module,它提供了具有this.code = 409; //Conflict属性的精美包装类。我在一些项目中使用了这个效果。

答案 1 :(得分:0)

You could try to define the status code in the route:

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

Then:

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