Esta traducci贸n proporcionada por StrongLoop / IBM.

Este documento puede estar desfasado respecto a la documentaci贸n en ingl茅s. Para ver las 煤ltimas actualizaciones, consulte la documentaci贸n en ingl茅s.

Manejo de errores

Defina las funciones de middleware de manejo de errores de la misma forma que otras funciones de middleware, excepto que las funciones de manejo de errores tienen cuatro argumentos en lugar de tres: (err, req, res, next). Por ejemplo:


app.use(function(err, req, res, next) {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

El middleware de manejo de errores se define al final, despu茅s de otras llamadas de rutas y app.use(); por ejemplo:


var bodyParser = require('body-parser');
var methodOverride = require('method-override');

app.use(bodyParser());
app.use(methodOverride());
app.use(function(err, req, res, next) {
  // logic
});

Las respuestas desde una funci贸n de middleware pueden estar en el formato que prefiera, por ejemplo, una p谩gina de errores HTML, un mensaje simple o una serie JSON.

A efectos de la organizaci贸n (y de infraestructura de nivel superior), puede definir varias funciones de middleware de manejo de errores, de la misma forma que con las funciones de middleware normales. Por ejemplo, si desea definir un manejador de errores para las solicitudes realizadas utilizando XHR, y las que no lo tienen, puede utilizar los siguientes mandatos:


var bodyParser = require('body-parser');
var methodOverride = require('method-override');

app.use(bodyParser());
app.use(methodOverride());
app.use(logErrors);
app.use(clientErrorHandler);
app.use(errorHandler);

En este ejemplo, los logErrors gen茅ricos pueden escribir informaci贸n de solicitudes y errores en stderr, por ejemplo:


function logErrors(err, req, res, next) {
  console.error(err.stack);
  next(err);
}

Tambi茅n en este ejemplo, clientErrorHandler se define de la siguiente manera; en este caso, el error se pasa de forma expl铆cita al siguiente:


function clientErrorHandler(err, req, res, next) {
  if (req.xhr) {
    res.status(500).send({ error: 'Something failed!' });
  } else {
    next(err);
  }
}

La funci贸n que detecta todos los errores de errorHandler puede implementarse de la siguiente manera:


function errorHandler(err, req, res, next) {
  res.status(500);
  res.render('error', { error: err });
}

Si pasa cualquier valor a la funci贸n next() (excepto la serie 'route'), Express considera que la solicitud actual tiene un error y omitir谩 las restantes funciones de middleware y direccionamiento que no son de manejo de errores. Si desea manejar ese error de alguna manera, deber谩 crear una ruta de manejo de errores como se describe en la siguiente secci贸n.

Si tiene un manejador de rutas con varias funciones de devoluci贸n de llamada, puede utilizar el par谩metro route para omitir el siguiente manejador de rutas. Por ejemplo:


app.get('/a_route_behind_paywall',
  function checkIfPaidSubscriber(req, res, next) {
    if(!req.user.hasPaid) {

      // continue handling this request
      next('route');
    }
  }, function getPaidContent(req, res, next) {
    PaidContent.find(function(err, doc) {
      if(err) return next(err);
      res.json(doc);
    });
  });

En este ejemplo, se omitir谩 el manejador getPaidContent, pero los restantes manejadores en app para /a_route_behind_paywall continuar谩n ejecut谩ndose.

Las llamadas a next() y next(err) indican que el manejador actual est谩 completo y en qu茅 estado. next(err) omitir谩 los dem谩s manejadores de la cadena, excepto los que se hayan configurado para manejar errores como se ha descrito anteriormente.

El manejador de errores predeterminado

Express se suministra con un manejador de errores incorporado, que se encarga de los errores que aparecen en la aplicaci贸n. Esta funci贸n de middleware de manejo de errores predeterminada se a帽ade al final de la pila de funciones de middleware.

Si pasa un error a next() y no lo maneja en el manejador de errores, lo manejar谩 el manejador de errores incorporado; el error se escribir谩 en el cliente con el seguimiento de la pila. El seguimiento de la pila no se incluye en el entorno de producci贸n.

Establezca la variable de entorno NODE_ENV en production, para ejecutar la aplicaci贸n en modalidad de producci贸n.

Si invoca next() con un error despu茅s de haber empezado a escribir la respuesta (por ejemplo, si encuentra un error mientras se env铆a la respuesta en modalidad continua al cliente), el manejador de errores predeterminado de Express cierra la conexi贸n y falla la solicitud.

Por lo tanto, cuando a帽ade un manejador de errores personalizado, se recomienda delegar en los mecanismos de manejo de errores predeterminados de Express, cuando las cabeceras ya se han enviado al cliente:


function errorHandler(err, req, res, next) {
  if (res.headersSent) {
    return next(err);
  }
  res.status(500);
  res.render('error', { error: err });
}