Manejo de Errores en Express.js

En Express.js, el middleware para gestionar errores se implementa de forma similar a otros middlewares, pero requiere cuatro parámetros en lugar de tres: (error, solicitud, respuesta, siguiente). Un ejemplo básico sería:app.use(function(error, solicitud, respuesta, siguiente) { console.error(error.stack); respuesta.status(500).send('¡Ha ocurrido un fallo!'); });Este middleware debe registrarse después de otras definiciones de middleware y rutas, como se muestra a continuación:``` var analizadorDeCuerpo = require('body-parser'); var sobreescrituraDeMetodo = require('method-override');

app.use(analizadorDeCuerpo()); app.use(sobreescrituraDeMetodo()); app.use(function(error, solicitud, respuesta, siguiente) { // Lógica de manejo de errores aquí });


Para mejorar la organización, es posible definir múltiples middlewares de manejo de errores, por ejemplo, uno para solicitudes XHR y otro para el resto:```
var analizadorDeCuerpo = require('body-parser');
var sobreescrituraDeMetodo = require('method-override');

app.use(analizadorDeCuerpo());
app.use(sobreescrituraDeMetodo());
app.use(registrarErrores);
app.use(manejadorDeErroresCliente);
app.use(manejadorDeErrores);
```La función `registrarErrores` podría encargarse de enviar información de errores a un servicio de registro:```
function registrarErrores(error, solicitud, respuesta, siguiente) {
  console.error(error.stack);
  siguiente(error);
}
````manejadorDeErroresCliente` se define para tratar errores específicos del cliente, pasando el error a `siguiente` en caso contrario:```
function manejadorDeErroresCliente(error, solicitud, respuesta, siguiente) {
  if (solicitud.xhr) {
    respuesta.status(500).send({ error: '¡Fallo crítico detectado!' });
  } else {
    siguiente(error);
  }
}
````manejadorDeErrores` captura todos los errores restantes de manera general:```
function manejadorDeErrores(error, solicitud, respuesta, siguiente) {
  respuesta.status(500);
  respuesta.render('error', { error: error });
});
```Al pasar un argumento a `siguiente()` (excepto la cadena 'ruta'), Express interpreta que existe un error y omite las funciones de middleware y rutas subsiguientes. Para casos especiales, se puede crear una ruta dedicada al manejo de errores.

Si una ruta tiene múltiples callbacks, el parámetro 'ruta' permite saltar al siguiente manejador. Ejemplo:```
app.get('/acceso_contenido_pago', 
  function validarSuscripcion(req, res, siguiente) {
    if(!req.user.hasPaid) { 
      siguiente('ruta');
    }
  }, function obtenerContenido(req, res, siguiente) {
    PaidContent.find(function(err, doc) {
      if(err) return siguiente(err);
      res.json(doc);
    });
  });
```En este caso, `obtenerContenido` se saltará, pero otros manejadores definidos para '/acceso_contenido_pago' continuarán ejecutándose.

Manejador de errores predeterminado de Express
--------

Express incluye un manejador de errores integrado que captura cualquier error no controlado en la apliacción. Este se añade automáticamente al final de la pila de middleware. Si se pasa un error a `siguiente()` sin un manejador personalizado, el predeterminado enviará el error y el seguimiento de pila al cliente (solo en entornos de desarrollo).

Si ya se ha iniciado la transmisión de datos al cliente y ocurre un error, el manejador predeterminado cerrará la conexión y notificará la falla en la solicitud.

Al implementar un manejador personalizado, se puede delegar al predeterminado si los encabezados ya se enviaron:```
function manejadorDeErrores(error, solicitud, respuesta, siguiente) {
  if (respuesta.headersSent) {
    return siguiente(error);
  }
  respuesta.status(500);
  respuesta.render('error', { error: error });
}

Etiquetas: express nodejs Middleware error-handling JavaScript

Publicado el 6-19 23:11