Как правильно передать код ошибки HTTP в промежуточное программное обеспечение для обработки ошибок? - PullRequest
0 голосов
/ 16 октября 2018

Я создаю RESTful API с помощью node.js и Express Framework и ищу способ создания промежуточного программного обеспечения для обработки единой ошибки.Мой текущий подход:

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 ]

0 голосов
/ 16 октября 2018

Передача кода с обычным объектом Error - это нормально, но code слишком обобщенный и может использоваться другими ошибками, поэтому httpCode может быть лучше.

Но я бы личнопредпочитаю использовать пользовательские классы, чтобы мне не приходилось запоминать коды ошибок или случайно набирать номера, и вы можете четко определить, что это действительно ошибка, представляющая код ошибки http, и что code не относится к чему-либоelse.

Таким образом, установка может выглядеть так:

 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;
0 голосов
/ 16 октября 2018

Вы на правильном пути.Поможет документация MDN для объекта Error .Кроме того, кроссплатформенный StackTrace.js может быть действительно полезным в вашем сценарии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...