‫Maestro: En este video,
‫ahora creemos una clase de error mejor y más
‫útil, y también hagamos una refactorización.
‫Y comenzando con esa clase de
‫error, creemos un nuevo archivo en nuestra carpeta Utilidades.
‫Entonces, nuevo archivo, y lo llamaré
‫AppError porque ese será el nombre de la clase, ¿de acuerdo?
‫Entonces, clase AppError, y en realidad queremos que todos nuestros
‫objetos AppError hereden del error incorporado,
‫por lo que extendamos la clase de error incorporada.
‫Entonces, usamos Extended Error, ¿de acuerdo?
‫Entonces, hicimos eso antes en algún lugar de
‫este curso, y nuevamente, estas son solo clases de ES6, ¿de acuerdo?
‫En este caso, herencia de
‫clases, donde una clase hereda de la otra, ¿de acuerdo?
‫Luego, como siempre, nuestro constructor y lo
‫que vamos a pasar a un
‫nuevo objeto creado a partir de la
‫clase AppError serán el mensaje y el statusCode, así que solo
‫estos dos.
‫Bien, recuerde que se llama al método constructor cada
‫vez que creamos un nuevo objeto fuera de esta clase.
‫Ahora, como de costumbre, cuando extendemos
‫una clase padre, llamamos super para llamar al constructor
‫padre, de acuerdo, y lo
‫hacemos con mensaje porque el mensaje es en
‫realidad el único parámetro que acepta el error incorporado.
‫Bien, entonces esto es básicamente, estás, como, llamando
‫a error, está bien, y luego
‫esto es lo
‫habitual, configuramos el statusCode en statusCode, de acuerdo, y ahora
‫también queremos establecer el estado en sí.
‫Por lo tanto, recuerde que el estado puede ser fallido
‫o error, y podríamos pasar eso al
‫objeto, pero tampoco es
‫realmente necesario, porque el estado depende del statusCode.
‫Entonces, cuando el statusCode es 400,
‫entonces el estado fallará,
‫y si es 500, entonces será un error, correcto,
‫y eso simplemente prueba si
‫el statusCode comienza con cuatro.
‫Entonces, en JavaScript, hay un método startsWith al que podemos llamar
‫cadenas, y creo que esa
‫es la forma más fácil de hacer esta
‫prueba, y eso es básicamente convertir el código de estado en
‫una cadena, y para eso simplemente estoy usando un plantilla
‫de cadena con el código allí, así que
‫esto, o en realidad podemos usar statusCode.
‫Entonces, statusCode,
‫y luego startsWith, aquí también
‫necesitamos una cadena, y si el statusCode como
‫cadena comienza con un cuatro, bueno, entonces tenemos un error.
‫Y aquí, usemos el ternario, está bien, entonces
‫falla cuando comienza con un cuatro,
‫y de lo contrario es un error, ¿de acuerdo?
‫Entonces, es muy simple, y esto ya
‫nos ahorra tener que pasar manualmente ya sea fallar o error.
‫Muy bien, ahora a continuación,
‫todos los errores que
‫crearemos usando esta clase serán todos errores operativos.
‫Entonces, los errores que
‫podemos predecir sucederán en algún momento
‫en el futuro, como por ejemplo,
‫un usuario que crea un recorrido sin los campos obligatorios, ¿verdad?
‫Así que ese es un error operativo, está
‫bien, y nuevamente, de ahora en
‫adelante, siempre usaremos esta clase AppError aquí
‫que estamos creando ahora
‫mismo para crear todos los errores en nuestra aplicación.
‫Entonces, estos errores serán errores operativos, por lo que
‫lo que voy a hacer
‫ahora es crear también un archivo. Es propiedad operativa aquí.
‫Así que esto. está operativo
‫y configúrelo como verdadero.
‫Entonces, todos nuestros errores harán
‫que esta propiedad se establezca en verdadera,
‫y lo estoy
‫haciendo para que luego podamos probar esta
‫propiedad y solo enviar mensajes
‫de error al cliente para estos errores
‫operativos que creamos usando esta clase.
‫Y esto es útil porque
‫algunos otros errores inesperados que pueden ocurrir en
‫nuestra aplicación, por ejemplo, un error de programación,
‫o algún error en uno de los
‫paquetes que requerimos en nuestra aplicación,
‫y estos errores,
‫por supuesto, no tendrán esto. es una propiedad
‫operativa en ellos, de acuerdo, y
‫puede sonar un poco confuso
‫en este punto, pero no
‫se preocupe, tendrá mucho sentido
‫cuando implementemos esa parte que acabo de mencionar.
‫Entonces, probando esto. Es propiedad operativa aquí.
‫Muy bien, y ahora solo un último
‫paso es que en realidad también necesitamos capturar el seguimiento de la pila.
‫Ahora, ¿qué quiero decir con seguimiento de pila?
‫Entonces, permítanme mostrarles eso, entonces, mostrarles
‫qué es el seguimiento de la pila, y
‫así lo registraré aquí en la consola.
‫Consola. registro y error. stackTrace, por
‫lo que todos y cada uno de los errores obtienen este seguimiento
‫de pila, y en realidad es solo pila, está bien.
‫Así que err. stack básicamente nos
‫mostrará dónde ocurrió el error.
‫Así que permítanme ejecutar
‫esto aquí ahora, y echemos un
‫vistazo a esto, y nos
‫da aquí el error y luego también dónde sucedió, ¿de acuerdo?
‫Entonces, en este caso aquí,
‫por supuesto, agregue app. js en la línea 32.
‫Entonces, aquí mismo.
‫Entonces, ahí es donde
‫creamos este error, y ahora está
‫en nuestro seguimiento de pila, y también nos muestra
‫la pila de llamadas completa aquí, que al final se originó en este error, ¿de acuerdo?
‫Así que queremos preservar
‫eso y al mismo tiempo no agregar este método aquí,
‫o esta clase, a esa pista de pila, ¿de acuerdo?
‫Y nuevamente, eso suena un poco
‫confuso, lo sé, pero en
‫este caso no es realmente importante, todo lo
‫que importa es que agreguemos esta línea de código
‫aquí, que es Error. capturestackTrace, exactamente lo
‫que obtienes aquí, y primero
‫necesitamos especificar el objeto actual, que es
‫este, y luego la clase AppError en sí, que
‫será este. constructor.
‫De acuerdo, de esta manera, cuando se crea un nuevo
‫objeto y se llama a una función constructora, esa llamada a
‫la función no aparecerá en el
‫seguimiento de la pila y no la contaminará.
‫Muy
‫bien, dejémoslo aquí, y
‫sí, esa es nuestra clase AppError,
‫y ahora exportémoslo desde aquí.
‫Entonces, module. exportaciones es, por supuesto, AppError.
‫Genial, solo una pregunta que puede tener es '¿Por
‫qué no configuré esto? mensaje igual a mensaje? 'Bueno, eso
‫es solo porque aquí mismo llamé a la
‫clase padre, correcto, y la clase padre
‫es error, y lo que sea que pasemos
‫será la propiedad del mensaje.
‫Así que como te dije antes.
‫Y así, básicamente, aquí, al hacer esta llamada principal, ya configuramos
‫la propiedad del mensaje en
‫nuestro mensaje entrante.
‫Muy bien, guardelo, y ahora podemos cerrarlo, ya
‫no lo necesitamos,
‫y aquí lo vamos a importar aquí.
‫Const AppError,
‫require,
‫y luego está
‫en utils, entonces Utilities y appError, está bien,
‫y ahora vamos a usarlo.
‫Comente este fragmento de código
‫y, de hecho, elimine el que teníamos
‫antes, y eso
‫ahora creará el error aquí dentro del siguiente.
‫Entonces, nuevo AppError, y luego
‫el mensaje, que es
‫este, y el código
‫de estado.
‫Correcto, y el error, recuerde,
‫se resolverá automáticamente, así que eliminemos todo esto, démosle
‫un guardado
‫aquí y una vez más, pruebe esta ruta incorrecta, y
‫de hecho, todavía obtenemos nuestro mismo error,
‫y también seguimos obteniendo exactamente el mismo seguimiento de pila.
‫Bien, y finalmente también quiero
‫exportar este middleware aquí, ¿de acuerdo?
‫Básicamente, este controlador porque a lo
‫largo del resto de la sección,
‫vamos a crear un par
‫de funciones diferentes para manejar diferentes tipos de errores, así
‫que quiero que todas
‫estas funciones estén en el mismo archivo, ¿de acuerdo?
‫Y podemos decir que todas estas funciones que
‫acabo de mencionar son controladores, de acuerdo, y por
‫lo tanto, controladores, también los llamamos controladores en
‫el contexto de la arquitectura MVC, por lo
‫que ahora creemos un
‫archivo controlador de errores en nuestra carpeta de controladores.
‫De acuerdo, y esto puede sonar o parecer un poco extraño porque en
‫realidad no tenemos un recurso de error correcto, por lo
‫que probablemente algunas personas no estarán de acuerdo conmigo
‫en que este es el lugar
‫correcto, pero personalmente me gusta hacerlo así porque
‫en Al final
‫del día, estas funciones, son un poco
‫como para controlar nuestros errores, de acuerdo, así
‫que para mí al menos tiene
‫sentido simplemente llamar a esta función aquí el controlador de errores, y
‫aquí quería pegar esa función de middleware , pero supongo que
‫no lo copié, así que hagámoslo de nuevo.
‫Está bien, y de hecho voy a exportar
‫este aquí como módulo. exporta porque
‫las otras funciones
‫de control que crearemos
‫más adelante, no las exportaré desde aquí.
‫Así que simplemente van a ser ayudantes.
‫Entonces, module. las exportaciones es igual a esta función, ¿de acuerdo?
‫De hecho, eliminemos esta consola. inicie sesión aquí,
‫guarde, y ahora de vuelta a nuestra aplicación,
‫por supuesto, ahora necesitamos conectar esa
‫función de middleware aquí.
‫Entonces, sigamos adelante e importémoslo
‫y puedo llamarlo como
‫quiera,
‫así que déjame llamarlo
‫globalErrorHandler con una H
‫mayúscula, y
‫voy a requerir controladores y errorController.
‫Vuelva a ponerlo aquí, y ahora para la prueba
‫final después de esta refactorización.
‫Veamos, y de hecho, una
‫vez más, todo funciona bien, ¿de acuerdo?
‫Entonces, perfecto, ese era el objetivo de este video, nos vemos
‫en el siguiente.