‫Instructor: Ahora hagamos un mayor
‫uso de nuestro negocio de clase
‫AppError agregando un par de errores 404 y algunas
‫de nuestras funciones de controlador de recorrido.
‫Ahora, solo una cosa que
‫quería decir antes de implementar estos errores 404
‫es que, por supuesto, podríamos haber usado la función
‫catchAsync también en nuestro enrutador, ¿de acuerdo?
‫Entonces, déjame mostrarte cómo funcionaría.
‫Entonces, aquí en
‫TourRoutes, podría haber envuelto
‫esta función aquí en catchAsync así en
‫lugar de hacerlo aquí en el controlador.
‫Entonces, aquí donde lo hice de hecho, ¿verdad?
‫Y eso habría tenido exactamente el mismo resultado,
‫pero no lo
‫hice de esta manera porque así,
‫tengo que recordar cuál de
‫estos métodos aquí es en realidad
‫un método de sincronización, está bien, de
‫modo que solo en esos agrego la función catchAsync , ¿Derecha?
‫Ahora, en este caso, en realidad todos son funciones
‫asincrónicas y, por lo tanto, ese no es realmente el problema
‫aquí en este ejemplo, pero
‫habrá algunos ejemplos más adelante en los que no todos los
‫controladores son
‫funciones asincrónicas y, por lo tanto,
‫en ese caso, realmente tendría para recordar cuál de
‫ellos tengo que envolver
‫en catchAsync y cuáles no,
‫y así, hacerlo en el controlador es mucho más fácil
‫porque simplemente cada vez
‫que escribo una función asíncrona
‫aquí, ya lo saben bien, necesito ajustar en catchAsync.
‫Bueno.
‫Entonces, no lo voy a
‫hacer aquí, solo lo hago como les mostré en el último video.
‫De acuerdo, una vez me encontré con un error que
‫fue muy difícil de
‫encontrar porque en realidad envolví
‫una función que no era asíncrona en catchAsync
‫y, por lo tanto, realmente no
‫funcionamos y no pude averiguar dónde estaba el
‫error y desperdicié mucho tiempo en ese.
‫Y así, desde entonces, ya no pongo catchAsync aquí, sino muy
‫cerca de donde realmente lo necesito,
‫tan cerca del código que en realidad es asincrónico.
‫Bien, y habiendo
‫dicho eso, ahora implementemos algunos errores 404 aquí.
‫Muy bien, quiero
‫comenzar mostrándoles nuevamente el ejemplo
‫que hicimos en el último video.
‫Bien, intentamos hacer un recorrido
‫para esta ID extraña que realmente no existe
‫y el
‫error que obtuvimos es que básicamente
‫Mongoose no pudo convertir esta cadena
‫aquí en una ID válida para MongoDB.
‫Pero, ¿qué sucede cuando en realidad usamos un ID de MongoDB válido?
‫Entonces, por ejemplo, vamos, sí, copiemos este aquí, está
‫bien, y
‫este, por supuesto, tendrá un resultado y, por
‫lo tanto, cambiémoslo ligeramente, por ejemplo, cambiar esto
‫a cero aquí seguirá siendo una
‫ID válida , por lo que
‫se ve así y
‫se ve exactamente igual que
‫antes, acabo de
‫cambiar un número, pero esta identificación probablemente no exista.
‫Entonces, veamos qué obtenemos.
‫Y de hecho, ahora nuestro resultado aquí es nulo.
‫Está bien, entonces, eso no es realmente lo que queremos, ¿verdad?
‫Lo que queremos aquí es mostrar un código de estado 404 aquí y
‫decir que no se encontró este recorrido.
‫De acuerdo, usemos ahora la clase orAppError
‫para implementar eso.
‫Solo tenga en cuenta
‫que el recorrido que volvemos aquí es nulo, ¿de acuerdo?
‫Entonces, nulo que ahora podemos probar.
‫Entonces, si vamos a nuestro controlador getTour,
‫implementemos ahora si no hay un recorrido y en ese caso crearemos un
‫error y esto aquí funciona porque
‫si
‫no hay un
‫recorrido, será nulo.
‫Recuerde y en JavaScript, nulo es un valor de falacia, por lo
‫que un valor que se convertirá en falso aquí
‫en una declaración if.
‫Bien, y entonces, si no hay
‫recorrido, entonces recorrido es
‫falso y luego no falso es por supuesto
‫verdadero y entonces, así es como ingresamos a este bloque if.
‫Entonces, ¿qué queremos hacer si no hay gira?
‫Bueno, queremos crear a continuación con un error.
‫Entonces, para saltar directamente a o error y
‫middleware vinculado.
‫Entonces, hacemos un nuevo AppError que aún
‫no está disponible, todavía tenemos
‫que importarlo, pero usémoslo aquí de inmediato.
‫De acuerdo, y luego
‫digamos que no se encontró ningún recorrido con esa identificación.
‫Y luego un código
‫de estado, recuerde que el segundo argumento es 404, ¿de acuerdo?
‫Ahora, una última cosa que tenemos que
‫hacer aquí, que es decir regresar, está bien
‫porque queremos devolver esta función inmediatamente y no
‫pasar a la siguiente línea, que sería esta
‫y que luego
‫básicamente intentaría enviar dos respuestas y nosotros ya me encontré con ese
‫error antes, así que espero que
‫lo recuerdes y esa
‫es la razón por la que siempre necesitamos regresar aquí.
‫Bien, ahora vayamos a importar rápidamente el appError y eso
‫es similar a este aquí, así
‫que simplemente dupliquemos.
‫Está bien, y aquí está en realidad con una A mayúscula.
‫Muy bien, déjelo guardar y
‫ahora intentémoslo nuevamente y
‫ahora, de hecho, no se encontró ningún recorrido con ese ID 404.
‫Perfecto, exactamente lo que queríamos.
‫Ah, y también viste que aquí tenemos los fallidos.
‫Bueno, eso también viene de la clase.
‫Genial, eso funciona y realmente espero que a
‫estas alturas haya entendido exactamente cómo funciona ahora todo
‫este manejo de errores.
‫De acuerdo, nuevamente creamos un error y luego
‫pasamos ese error al siguiente y
‫tan pronto como el siguiente recibe algo,
‫se asume que es un
‫error y
‫saltará directamente al middleware de manejo de errores
‫globales que luego nos enviará la respuesta. , ¿okey?
‫Entonces, copiemos este
‫y pongámoslo en todos los demás
‫controladores que consultan documentos en función del ID.
‫Entonces, no cree un recorrido, sino actualice un recorrido, ¿de acuerdo?
‫Y así,
‫aquí mismo, si estamos tratando de
‫actualizar el recorrido que
‫no existe, entonces nos dará exactamente el mismo error.
‫Finalmente, por supuesto, lo mismo con eliminar.
‫Y ahora ves que ESLint me dio este error aquí
‫y eso es porque este recorrido no está
‫definido y, en este caso, ESLint realmente me salvó
‫aquí de crear este error.
‫¿Derecha?
‫Entonces, nuevamente sin ESLint, probablemente lo hubiera
‫pegado aquí y lo hubiera
‫terminado sin siquiera
‫darme cuenta de que el recorrido no está definido
‫en ninguna parte dentro de
‫esta función, pero desde que instalamos esta herramienta realmente valiosa,
‫ahora puedo seguir adelante y solucionarlo.
‫Muy bien, hasta
‫este punto, simplemente esperábamos esta instrucción de eliminación aquí y no
‫guardamos el resultado y eso
‫es simplemente porque no la necesitábamos.
‫De acuerdo, pero en este momento realmente lo
‫necesitamos porque queremos esta variable
‫de recorrido para verificar si realmente hay un recorrido o no.
‫Entonces, muy fácil, gira constante y luego igual
‫a ese resultado, dale
‫un guardado y luego el error desaparece.
‫Que bien.
‫ESLint en el trabajo, ¿de acuerdo?
‫Ahora, tal vez haya notado que no agregué este error 404 aquí
‫en este controlador getAllTour.
‫Entonces, ¿por qué hice eso?
‫Y déjame explicarte por qué.
‫Entonces, cuando no se encuentran resultados, por
‫ejemplo, no hay resultados que coincidan con un filtro, o porque se
‫solicitó la página que
‫no existe, entonces, por supuesto, podríamos considerar enviar un error
‫404 y decir que los datos no
‫fueron encontrado pero en mi opinión y
‫también la opinión de otros desarrolladores, eso
‫no es del todo correcto en esta solicitud porque
‫realmente no hubo un error.
‫Quiero decir, la solicitud fue recibida correctamente.
‫La base de datos buscó correctamente los
‫recorridos y encontró exactamente cero registros, por
‫lo que estos cero registros
‫son exactamente lo que enviaremos junto con el código HTTP 200.
‫De acuerdo, de nuevo considero que
‫realmente no puede haber un error cuando
‫un usuario solicita todos los recorridos a menos
‫que, por supuesto, haya alguna falla en la base de datos
‫o algo así.
‫Pero en ese
‫caso, Mongoose automáticamente arrojará un error.
‫Correcto, que a su vez será detectado por nuestra
‫función o catchAsync y, como
‫ya sabe, manejado en
‫nuestro controlador de errores global y, como ya
‫sabe, manejado
‫en nuestro middleware de manejo de errores global.
‫Muy bien, ya he dicho estas palabras tantas veces.
‫De todos modos, espero
‫que tenga sentido y, sí, sigamos adelante.