control de errores

En node.js el control de errores básico que se utiliza es mediante la sentencia try…catch. Si quisiéramos tener controles de errores para cada una de nuestras rutas, terminaríamos con muchos bloques try…catch que en su mayoría realizarán el mismo o parecido control de los errores.

express dispone de un middleware interno que permite centralizar la gestión de los errores. Un middleware que contiene cuatro argumentos en su función de callback es considerado un middleware de control de errores siendo el primer argumento una instancia el objeto Error y los otros tres los mismos que en un middleware ordinario. Es importante que estos middlewares aparezcan detrás de los middlewares que pueden provocar los errores, por lo que suelen aparecer casi al final del código.

app.use(function(err, req, res, next) {
    // control de errores
    });    

Se pueden definir varias funciones de middleware de control de errores, de la misma forma que con las funciones de middleware normales. Por ejemplo, si desea definir un controlador de errores para las solicitudes realizadas utilizando XHR, y las que no lo tienen, se podría hacer:

// routing y middleware normales
:
:

app.use((err, req, res, next)=> {
            console.error(err.stack);
            next(err);
});
app.use((err, req, res, next) => {
            if (req.xhr) {
            res.status(500).send({ error: 'Something failed!' });
            } else {
                next(err);
    }
});
app.use((err, req, res, next) => {
            res.status(500);
            res.render('error', { error: err });
});

// poner a escuchar al servidor
:                
            

Cuando se invoca la función next con un argumento, se entiende que se solicita la ejecución del siguiente middleware de control de errores. En el ejemplo, cuando se detecte un error en los middlewares normales y de routing primero se escribirá en la consola información del error producido, a continuación, si la solicitud es Ajax, se devolverá con un código de estado 500 y como contenido en JSON el objeto { error: 'Something failed!' }. Si la petición no fuera Ajax se ejecutará el siguiente controlador de error que devolverá con código de estado 500 la página renderizada error.handlebars a la que se ha pasado el dato error con el objeto err como contenido.

Si se pasa un error a next y no hay siguiente controlador de errores, será manejado por el control de errores predeterminado de express.

e-mail:manjarrés