‫Hombre: En este video, ahora vamos a
‫implementar el middleware de manejo de errores globales del que
‫acabamos de hablar antes.
‫Así que recuerde que
‫el objetivo es escribir una función
‫de middleware, que podrá manejar errores operativos como este.
‫Bien, entonces cuando un usuario ingresa a una URL que no existe,
‫mientras que podemos considerar que es un error
‫operativo, y en este caso lo manejamos
‫enviando esta respuesta aquí, ¿verdad?
‫Pero nuevamente, el objetivo es hacerlo en un lugar central.
‫Por ejemplo, tenemos cosas similares aquí.
‫Así que por todas partes aquí tenemos estos
‫fragmentos aquí, que manejan los errores.
‫Entonces tenemos que activar el bloque etch aquí, y
‫si hay un error, bueno,
‫entonces lo manejamos enviando ese error al cliente.
‫Y nuevamente, al final, queremos deshacernos
‫de todo esto y manejar el error
‫en un middleware central.
‫Y ahora comencemos construyendo realmente
‫esa función de middleware.
‫Y en Express, en realidad es muy fácil.
‫Recuerde que le dije que Express
‫ya viene con controladores de middleware
‫listos para usar.
‫Entonces, como siempre, comenzamos usando app. use, está bien, y
‫luego aquí definimos nuestra función de middleware.
‫Entonces, para definir un middleware de manejo
‫de errores, todo lo que tenemos que hacer es darle
‫cuatro argumentos a la función de middleware y Express lo
‫reconocerá automáticamente como un middleware de manejo de errores.
‫Y por lo tanto, solo llámelo cuando haya un error.
‫Y así, al igual que en muchos otros casos, esta
‫función de middleware es una función de error primero,
‫lo que significa que el
‫primer argumento
‫es el error, y luego tenemos la solicitud, la respuesta y el siguiente.
‫Entonces, al especificar cuatro parámetros, Express sabe automáticamente que
‫toda esta función aquí es un
‫middleware de manejo de errores.
‫Así que ahora implementemos el código para esta función aquí y luego
‫le mostraré cómo podemos crear un
‫error para que esta función de middleware
‫sea detectada.
‫Entonces, dos pasos, primero creamos el middleware, luego en
‫el segundo paso
‫crearemos un error para que esta función sea detectada.
‫Y por ahora, hagámoslo realmente simple aquí.
‫Entonces, todo lo que realmente queremos hacer
‫para manejar este error es enviar una respuesta al cliente.
‫Entonces res. estado, pero ahora
‫realmente no sabemos qué código de estado es, ¿verdad?
‫Entonces, por ejemplo, en este caso aquí es un 404, pero
‫tenemos algunos errores aquí, que tienen otros códigos de estado.
‫Como si tuviéramos un 400 por ejemplo para una mala solicitud,
‫o realmente todo tipo de otros códigos.
‫Y entonces realmente queremos leer ese
‫código de estado del objeto de error, ¿de acuerdo?
‫Entonces, cuando creamos ese error un poco más
‫adelante en el segundo
‫paso, como le dije, definiremos este código de estado en el error.
‫Digamos que el código de estado, y ahora quiero definir un
‫valor predeterminado aquí.
‫Porque habrá errores que no provienen de nosotros
‫porque habrá errores sin un código de
‫estado, por lo tanto, errores que no son
‫creados por nosotros, pero por ejemplo en otros lugares de
‫la aplicación de notas.
‫Y sé que suena un poco confuso por ahora, pero
‫lo verá a lo largo de esta sección.
‫Por ahora, definamos realmente este código de estado
‫predeterminado.
‫Entonces decimos que el error. statuscode es
‫igual a err. statuscode básicamente si está
‫definido o el código 500, lo que significa nuevamente, error interno
‫del servidor, y ese es generalmente el
‫estándar que usamos.
‫Y de la misma forma, también definimos el
‫estado, digamos error. el estado es igual a error. estado si está
‫definido, y si no, es
‫error.
‫Entonces, el error, recuerde, es cuando tenemos un código de estado 500 y si es
‫un código de estado 400, entonces es un error.
‫Entonces, por ejemplo, aquí en este 404, el estado es fallido.
‫Y ahora aquí
‫podemos usar eso, entonces error. statuscode, y luego enviar un json, muy
‫similar a lo que hicimos antes.
‫Entonces comenzamos con el estado y lo leemos desde el error. status y el
‫mensaje también vendrá del error.
‫Así que err. mensaje y te mostraré en un
‫segundo cómo ese error. Aquí se crea la propiedad de mensaje.
‫De acuerdo, pero por ahora, este es nuestro middleware de manejo
‫de errores muy simple.
‫Muy simple, pero por ahora funciona.
‫Y ahora el segundo paso, donde
‫realmente creamos un error.
‫Y hagámoslo aquí.
‫Así que aquí, en esa función, que maneja
‫todas las rutas no controladas, permítanme comentar
‫esta aquí y, en su lugar, queremos crear un error.
‫Entonces, digamos const err y
‫es un nuevo error.
‫Así que básicamente usamos el constructor de errores incorporado
‫para crear un error.
‫Y ahora podemos pasar una cadena y esa cadena
‫será la propiedad del mensaje de error.
‫Entonces, de lo que acabamos de hablar aquí.
‫Entonces ese mensaje debería ser este mensaje.
‫¿Está bien?
‫Y luego debería decir err. estado que
‫es
‫falla, y luego err. statusCode es igual a 404.
‫Entonces eso es lo que mencioné antes de que podemos definir el
‫código de estado y el estado en el objeto de error.
‫Y eso es exactamente lo que estamos haciendo aquí.
‫Estamos creando un error y luego definimos
‫el estado y las propiedades del código de estado en él para
‫que nuestro middleware de manejo
‫de errores pueda usarlos en el siguiente paso.
‫Pero ahora, ¿cómo leemos realmente ese siguiente paso?
‫Entonces, ese próximo middleware.
‫Bueno, como siempre, usamos el siguiente.
‫Pero esta vez usamos next de una manera especial.
‫Porque ahora necesitamos pasar ese error a la
‫siguiente, por lo que si la siguiente función recibe
‫un argumento, no importa cuál sea,
‫Express sabrá automáticamente que hubo un error, por lo que
‫asumirá que todo lo que pasemos a continuación
‫será una error.
‫Y eso se aplica a cada función siguiente en cada
‫middleware en cualquier lugar de nuestra aplicación.
‫Entonces, nuevamente, cada vez que pasamos algo al siguiente, asumirá
‫que es un error, y luego omitirá todos
‫los demás middlewares en la pila de
‫middleware y enviará el error que pasamos a nuestro
‫middleware de manejo de errores global, que luego
‫, por supuesto, ser ejecutado.
‫Y entonces pasemos ahora el
‫error que saltará nuevamente, todos los demás
‫middlewares en la pila e ir directamente a este.
‫Ahora bien, en este caso,
‫en realidad no hay otro middleware en el medio, ¿de acuerdo?
‫Entonces, en realidad, es solo el
‫siguiente aquí, pero si usáramos next y pasáramos un error en
‫otro lugar, entonces, por supuesto, funcionará de la misma manera.
‫Y ahora probemos todo esto simplemente
‫intentando acceder a una ruta que no estaba definida.
‫Y entonces eso activará todo este código aquí, saltará al
‫middleware de manejo de errores y luego
‫enviará la respuesta basada en toda esta
‫lógica aquí.
‫Entonces, aquí todavía tenemos nuestra ruta incorrecta o inexistente y
‫comencemos por llamar a esta, que aún
‫debería estar funcionando, está
‫bien, solo para confirmar
‫que todo funciona bien y lo hace, y
‫ahora esta.
‫Y, de hecho, no podemos encontrar recorridos de barra de API en este servidor, por
‫lo que nuestro middleware de manejo de errores global
‫está realmente haciendo su trabajo.
‫Perfecto, ese es el primer paso para implementar realmente un
‫mecanismo de manejo de errores mucho mejor
‫en nuestra aplicación.
‫Así que ahora podríamos seguir adelante e intentar implementar este
‫tipo de cosas aquí, en todas partes en todos
‫nuestros controladores.
‫Por ejemplo, aquí en todas estas funciones que tenemos
‫aquí.
‫Entonces reemplazando todo lo que tenemos aquí con
‫este tipo de error.
‫Pero lo que quiero hacer por ahora es crear
‫nuestra propia clase de error.
‫Para que no tengamos que escribir todo este código aquí y,
‫en su lugar, tengamos una clase más optimizada de
‫nosotros mismos.
‫Esa es una práctica común, y hagámoslo en el
‫siguiente video.