代码之家  ›  专栏  ›  技术社区  ›  rufus1530

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

  •  3
  • rufus1530  · 技术社区  · 8 年前

    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错误代码分配给 错误

    2 回复  |  直到 8 年前
        1
  •  3
  •   t.niese    8 年前

    code 有点过于泛化,也可能被其他错误使用,所以 httpCode

    但我个人更喜欢使用自定义类,这样我就不需要记住错误代码或意外地键入错误的数字,并且您可以清楚地识别出这确实是一个表示http错误代码的错误,并且 不涉及其他内容。

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

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

    const env = process.env.NODE_ENV;
    const ErrorHandler = (error, req, res, next) => {
      if( error instanceof HttpError ) {
        res.status(error.code || 500)
      } else {
        // maybe some additional internal logging that a "wrong" error object arrived here
        res.status(500)
      }
    
      if (env === 'production') {
        res.send();
      } else {
        res.send(error.stack);
      }
    };
    
    module.exports = ErrorHandler;
    
        2
  •  -1
  •   Steve -Cutter- Blades    8 年前

    你在正确的轨道上。的MDN文档 Error object 会有帮助的。另外,跨平台 StackTrace.js