Estoy construyendo una API RESTful con node.js y express framework y estoy buscando una forma de construir middleware de manejo de errores únicos. Mi enfoque actual es:

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

Mi error al manejar el middleware es el siguiente:

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;

¿Debo simplemente asignar códigos de error HTTP a la instancia del objeto Error o se considera una mala práctica? ¿Debería especificarse el código de respuesta a nivel de ruta? ¿Hay una mejor manera de hacer esto?

3
rufus1530 16 oct. 2018 a las 14:21

2 respuestas

La mejor respuesta

Pasar el código con un objeto Error normal está perfectamente bien, pero code es demasiado genérico y también podría ser utilizado por otros Errores, por lo que httpCode podría ser mejor.

Pero, personalmente, preferiría usar clases personalizadas para no tener que recordar los códigos de error o escribir incorrectamente los números y que pueda identificar claramente que realmente es un error que representa un código de error http, y que {{X0} } no se refiere a otra cosa.

Entonces, una configuración podría verse así:

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


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

Y el middleware de manejo de errores podría verse así:

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;
3
t.niese 16 oct. 2018 a las 11:42

Estás en el camino correcto. La documentación de MDN para el Objeto de error ayuda. Además, el StackTrace.js multiplataforma puede ser realmente útil en su situación.

-1
Steve -Cutter- Blades 16 oct. 2018 a las 11:26