Hoy vamos a discutir sobre el manejo de errores con express, esta es una parte vital de este framework, manejar los errores de forma manual puede hacer que nuestra aplicación sea difícil de mantener, además, hace que sea difícil reutilizar nuestro código, puedes mantener tu aplicación limpia y escalable mediante el uso del gestor de errores de express.

Antes de leer esto, debe comprender qué es y cómo funciona la función middleware de express, si deseas aprender más sobre la función middleware de express, te sugiero que vayas a mi publicación anterior: “Entendiendo la función middleware de Express.js”.

El gestor de errores de express es una función middleware, pero esta tiene cuatro parámetros en lugar de tres (err, req, res, next), el primer parámetro es el error que pasamos cuando llamamos a la siguiente función de esta forma: next(err).

// Ejemplo de un middleware para gestionar errores:

function myErrorHandlerMiddleware(err, req, res, next) {
  // your logic here

  next(err);
}

Empecemos con un ejemplo de una aplicación sencilla de express para entender como podemos usar el gestor de errores, el siguiente archivo contiene configuraciones básicas de express y algunas rutas de api rest, no te preocupes si no entiendes totalmente lo que esta pasando ahí, esto es solo para que comprendas donde debes definir tus gestores de errores, éstos deben ir al final de la aplicación, de otra manera las rutas de las apis no los van a poder llamar ejecutando la función next(err), recuerda que los middleware son funciones en cadena, y el orden en el cual las definimos es muy importante.

Definimos dos gestores de errores errorLogger y errorHandler, el primero solo hace un log del error, luego llama al siguiente gestor de errores ejecutando la función next(err), la siguiente función recibe el error y lo envía al cliente con el objeto res. Ten en cuenta que podemos tener tantos gestores de errores como queramos.

Estos gestores de errores se encargarán de todos los errores de nuestras funciones middleware, solo necesitamos ejecutar la función next pasando el error como parámetro de esta forma: next(err). Ten en cuenta que cada vez que ejecutes la función next sin pasar ningún parámetro de esta forma: next(), llamaras al siguiente middleware común, pero cuando le pasas como parámetro cualquier error next(cualquierErrorAqui) llamarás al siguiente gestor de errores.

Puede que necesites un gestor de errores solo para una ruta en particular, para manejar un error especifico en tu aplicación, podemos hacer esto si pasamos la función middleware que gestionara el error como parámetro al final de nuestra cadena de funciones en la ruta. Veamos un ejemplo:

La ruta ‘/user/’ llamara a la función auth.verifyToken y luego si ejecutamos next() llamamos a findByIdAndUpdate, la función que maneja los errores errorHandler solo será llamada si ejecutamos la función next(err) pasando como parámetro el error err en alguna de las funciones anteriores, y este gestor de errores solo podrá ser llamado en la ruta ‘/user/’, puedes tener el código que quieras en tu gestor de errores, este solo hace un log de que hubo un error tratando de editar el usuario y ejecuta next(err) para pasar el error al siguiente gestor de errores, quizá te estés preguntando cual es el siguiente gestor de errores si no hay más funciones en la cadena de la ruta ‘/user/’, recuerda que definimos nuestros gestores de errores al final del archivo app.js.

Las funciones middleware  y los gestores de errores pueden ser algo confusos, tuve algunas dificultades para lograr entenderlos, por eso decidí hacer esta guía sobre cómo usarlos, en mi siguiente publicación te daré algunos tips para mantener tu código limpio, de esta forma podrás leer y entender mejor tu código y te será más fácil hacerle mantenimiento.