‫-: Como mencioné en el
‫último video, hay tres tipos de errores
‫que pueden ser creados por Mongoose
‫en los que necesitamos marcar como errores operativos
‫para que podamos enviar mensajes de error significativos a
‫los clientes en producción.
‫Y comencemos ahora simulando estos tres errores, ¿de acuerdo?
‫Entonces, el primero es cuando probamos una ID no válida aquí,
‫así que simplemente algo
‫como esto, y Mongoose no podrá convertir
‫esto en una ID de MongoDB, recuérdelo.
‫Y este es el error que tenemos en este momento, y
‫de hecho, aquí puedes ver todo el tipo
‫de cosas que definimos que queríamos ver en las producciones.
‫Entonces, el objeto de error completo, luego el mensaje de
‫error y también la pila completa, ¿de acuerdo?
‫Y este es un ejemplo perfecto de
‫un error operativo.
‫Entonces, esto es algo que muy bien
‫podría suceder, por lo que debemos enviar una
‫respuesta significativa para manejar este error.
‫Y este es un ejemplo perfecto de un error operativo que es
‫muy probable que le suceda en algún momento a un cliente, por lo
‫que debemos manejarlo como uno solo, ¿de acuerdo?
‫Entonces, básicamente enviando un mensaje de error agradable
‫en lugar de algo como
‫esto, lo que no significa nada para ningún cliente, ¿verdad?
‫Bien, entonces el objetivo aquí
‫de nuevo será básicamente marcar este error como operativo
‫y crear un mensaje significativo, ¿de acuerdo?
‫Pero antes de que podamos
‫hacer eso, echemos un vistazo a los otros
‫dos errores de Mongoose que también tendremos que marcar como operativos, ¿de acuerdo?
‫Entonces, creemos un nuevo recorrido,
‫y lo que voy a hacer es crear un nombre duplicado.
‫Entonces, copiemos este aquí.
‫Y creo que todos los valores
‫aquí son correctos, así que intentemos esto ahora.
‫Y de hecho, aquí nos sale el error que ya conocemos, que
‫es un error de
‫clave duplicada porque ya tenemos un
‫recorrido, o un documento con el nombre de Forest Hiker, ¿de acuerdo?
‫Entonces, nuevamente, este es un error
‫que va a suceder en algún
‫momento, y nuevamente,
‫no tiene un mensaje de error muy significativo, ¿verdad?
‫Y, de nuevo, tenemos que cambiar eso.
‫Luego, el tercero también tiene que
‫ver con la validación, así que hagámoslo aquí en Update Tour.
‫Entonces, digamos que queremos tener un promedio de calificaciones de seis,
‫lo cual sabemos que no es válido, ¿verdad?
‫Porque dijimos que el máximo de ratingsAverage
‫podría ser cinco.
‫Entonces, veamos,
‫y de hecho, obtenemos este ValidationError, ¿verdad?
‫Entonces se llama ValidationError y
‫tiene este objeto de errores con todos los errores.
‫De hecho, pongamos otro aquí.
‫Entonces, digamos dificultad,
‫y luego algo más,
‫que no sea fácil, medio o
‫difícil, y ahora tenemos estos dos objetos aquí.
‫Uno para las calificaciones y otro para la dificultad, ¿de acuerdo?
‫Entonces, estos son
‫los tres errores que marcaremos
‫como operativos, comenzando con el primero,
‫así que básicamente, el tipo CastError, ¿de acuerdo?
‫Entonces, volvamos aquí, y haremos eso
‫aquí, nuevamente, porque solo queremos hacer esto en producción, ¿de acuerdo?
‫En desarrollo, no nos importa nada de esto.
‫Todo lo que queremos hacer
‫es ver nuestros errores para poder corregirlos básicamente,
‫pero en producción, aquí es donde queremos
‫enviar los mensajes de error significativos a los clientes.
‫Entonces, digamos si err. name es igual
‫a CastError, y así es como vamos a identificar este
‫tipo de error aquí
‫del que acabamos de hablar,
‫porque tiene el nombre de CastError, ¿de acuerdo?
‫Así que si err. el nombre
‫es CastError, bueno, entonces llamaremos a una función especial que
‫crearemos en un
‫segundo, que se llama handleCastError.
‫Y luego también diré aquí DB para base de datos, para
‫que sepamos que esto está relacionado con nuestra base de datos, ¿de acuerdo?
‫Y así es como va a funcionar.
‫Vamos a pasar
‫el error que creó Mongoose a
‫esta función, así que así, y esto
‫devolverá un nuevo error creado sin la clase AppError, ¿de acuerdo?
‫Y ese error se marcará como operativo,
‫porque recuerde, todos nuestros AppErrors
‫tienen las propiedades
‫operativas establecidas en dos automáticamente, ¿verdad?
‫Entonces, esto devolverá un error, así que, guardémoslo, ¿de acuerdo?
‫Y también lo estaban guardando en error.
‫Ahora bien, no es
‫una buena práctica anular los argumentos de una función, ¿de acuerdo?
‫Entonces, el error proviene de esta función de error del medio, ¿verdad?
‫Entonces, a partir de aquí, y en lugar de
‫hacer eso, realmente crearé una
‫copia impresa de ese objeto de error, ¿de acuerdo?
‫Así que let, y estoy usando let, y no
‫const, porque, por supuesto,
‫reasignaremos un nuevo error más adelante aquí.
‫Entonces, llamemos a este error en lugar de simplemente
‫err, que es el nombre normal de los errores en Express.
‫Y de nuevo, usaremos nuestro
‫truco donde usamos la desestructuración del error original, ¿de acuerdo?
‫Y así, de ahora en adelante, usaremos este error en lugar de err.
‫Entonces aquí, y aquí, y aquí.
‫¿Bien?
‫Entonces, sigamos adelante
‫y creemos esta función aquí.
‫Pongamos eso aquí desde el principio.
‫Bien.
‫Trate de recordar que esto recibe
‫un error, y ahora voy a volver a llamarlo err
‫así, porque nuevamente ese es el estándar en Express.
‫Y para comenzar, echemos
‫un vistazo nuevamente al objeto de error aquí, ¿de acuerdo?
‫Así que aquí tenemos el camino y también el valor, ¿de acuerdo?
‫Entonces, la ruta aquí es básicamente el nombre del campo
‫para el cual los datos de entrada están en el formato incorrecto, ¿de acuerdo?
‫Y ese valor aquí es entonces este, que
‫es, por supuesto, el que hicimos en el pasado, ¿de acuerdo?
‫Entonces, esto podría suceder no solo para el ID, sino
‫también para cualquier campo que consultamos
‫con un valor en el formato incorrecto, ¿de acuerdo?
‫Entonces, ahora básicamente creemos
‫una cadena que diga que tenemos
‫una ID no válida con el valor de este en este caso, ¿de acuerdo?
‫Entonces, es camino y valor, ¿de acuerdo?
‫Entonces, creemos un mensaje aquí y digamos Error
‫no válido. camino es
‫err. valor.
‫¿Okey?
‫Y ahora, simplemente devolvemos nuestro propio AppError.
‫¿Okey?
‫Así que como mencioné un par de veces, ¿de acuerdo?
‫Entonces AppError, y de hecho tengo que incluirlo aquí,
‫o requerirlo, porque todavía no lo hice.
‫Entonces, const AppError es igual a require, y
‫sube un nivel, luego a la carpeta de
‫utilidades y luego a appError.
‫Aquí está.
‫Y ahora, en o AppError, pasamos nuestro mensaje y el
‫código de estado 400, que significa Solicitud incorrecta.
‫De acuerdo, y así, así, transformamos
‫el extraño error que recibíamos
‫de Mongoose en un error
‫operativo con un mensaje
‫agradable y amistoso que (se ríe)
‫un
‫humano real puede leer, ¿de acuerdo?
‫De acuerdo, una última cosa que
‫tenemos que cambiar aquí es establecer también este aquí en error, ¿de acuerdo?
‫Y entonces, ahora mismo, si nuestro error es CastError,
‫bueno, entonces pasaremos el error a esta
‫función que devolverá nuestro AppError, entonces este,
‫y ese es el que luego será enviado al
‫cliente usando nuestro sendErrorProd, ¿okey?
‫Entonces, intentemos ahora realmente eso.
‫Así que aquí, en nuestro paquete. json,
‫tenemos este script start: prod, así que intentémoslo.
‫Entonces, npm run start: prod, y puedo completar automáticamente estos nombres de scripts
‫npm usando la pestaña aquí en la terminal, ¿de acuerdo?
‫Entonces, esto iniciará un
‫proceso en modo de producción, básicamente, ¿de acuerdo?
‫Entonces, intentemos esto de nuevo.
‫Entonces, si ahora está haciendo
‫esta solicitud, deberíamos recuperar el mensaje
‫de error que acabamos de crear, porque ahora mismo, estamos en producción.
‫Y de hecho, aquí está.
‫Entonces tenemos inválido, y luego el nombre del campo, o
‫en realidad el nombre de la ruta, y luego el
‫valor que ingresamos.
‫Entonces, si probamos
‫algo diferente, obtenemos esto y,
‫por supuesto, también nuestro código 400 Bad Request.
‫Ok genial.
‫Entonces, este ahora está manejado.
‫En la próxima lección, nos ocuparemos de la siguiente, que
‫es para nombres de campo duplicados, ¿de acuerdo?
‫Entonces, nos vemos en un segundo.