如何正确地将HTTP错误代码传递给错误处理中间件?

时间:2018-10-16 11:21:11

标签: javascript node.js rest express

我正在使用node.js和express框架构建RESTful API,我正在寻找一种构建单个错误处理中间件的方法。我目前的方法是:

router.get('/some-resource', (req, res, next) => {
  // some logic that resolves to BAD REQUEST
  const error = new Error('Bad request example message')
  error.code = 400; // should I do this?
  next(error);
});

我的错误处理中间件如下:

const env = process.env.NODE_ENV;
const ErrorHandler = (error, req, res, next) => {
  const {code, stack} = error;
  if (env === 'production')
    return res.sendStatus(code || 500);
  res.status(code).send(stack);
};

module.exports = ErrorHandler;

我应该只将HTTP错误代码分配给 Error 对象的实例,还是认为它是一种不好的做法?是否应该在路由级别指定响应代码?有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

将代码与常规Error对象一起传递是完全可以的,但是code有点太通用了,可能还会被其他Errors使用,因此httpCode可能会更好。

但是我个人更喜欢使用自定义类,这样我就不必记住错误代码或意外地键入数字,您可以清楚地确定这确实是代表http错误代码的错误,并且{ {1}}没有引用其他内容。

所以设置看起来像这样:

code

错误处理中间件可能如下所示:

 class HttpError extends Error {
    constructor(code, message) {
      super(message)
      this.code = code
    }
 }


 class BadRequestError extends HttpError {
    constructor(message) {
      super(400, message)
    }
 }

答案 1 :(得分:-1)

您在正确的轨道上。 Error object的MDN文档将有所帮助。另外,跨平台StackTrace.js在您的情况下确实很有帮助。