‫Instructor: Al igual que
‫Express, Mongoose también tiene el concepto de middleware.
‫Y ahora aprendamos sobre el primer
‫tipo de middleware, que es el middleware de documentos.
‫Ahora, al igual que con Express, podemos
‫usar el middleware Mongoose para hacer que algo
‫suceda entre dos eventos.
‫Por ejemplo, cada vez que se guarda un
‫nuevo documento en la base de datos,
‫podemos ejecutar una función entre el comando de guardar y
‫el guardado real del documento, o también después del guardado real.
‫Y esa es la razón por la que
‫el middleware Mongoose también se llama pre y post hooks.
‫De nuevo, porque podemos definir funciones para que
‫se ejecuten antes o después de un determinado evento, como guardar
‫un documento en la base de datos.
‫Entonces, el middleware es un concepto absolutamente fundamental en Mongoose,
‫al igual que en Express.
‫Y hay toneladas de posibilidades
‫y casos de uso para middleware, y
‫usaremos middleware todo el tiempo en este proyecto.
‫Por lo tanto, hay cuatro tipos de
‫middleware en Mongoose: middleware de documentos, consultas, agregados y modelos.
‫Y en esta conferencia, hablaremos
‫sobre el software intermedio de documentos, que
‫es un software intermedio que puede actuar sobre el documento procesado actualmente.
‫Entonces, al igual que las propiedades virtuales,
‫definimos un middleware en el esquema,
‫entonces tourSchema. pre.
‫Y esto es para middleware previo, que nuevamente,
‫se ejecutará antes de un evento real.
‫Y ese evento en este caso es el evento de salvar.
‫Y entonces esta función de devolución de
‫llamada que vamos a
‫definir aquí a
‫continuación, funciona para que esta función se llame antes de que se guarde un
‫documento real en la base de datos.
‫Así que esto es middleware de documentos y se
‫ejecuta, déjame escribir todo eso aquí.
‫Por lo tanto, se ejecuta antes del comando de
‫guardar y el. crear comando.
‫Pero no en insertar muchos.
‫Entonces, si usamos este comando aquí, insertMany, entonces eso en
‫realidad no activará el middleware de guardado.
‫Así que tenlo siempre en cuenta.
‫Es muy importante darse cuenta de que solo
‫al guardar y al crear este middleware
‫se ejecutará.
‫Entonces, comencemos por hacer una consola simple. log y lo que voy
‫a iniciar sesión a través de la consola es esto.
‫Y así, en un middleware de guardado, la palabra
‫clave disk aquí apuntará al documento procesado actualmente.
‫Y esa es la razón por la que se llama middleware de documentos.
‫Nuevamente, porque en esta función
‫aquí, tenemos acceso al documento que se está procesando.
‫Entonces, en este caso, el documento que se está guardando.
‫Permítanme mostrarles eso muy rápidamente usando esta
‫consola. Iniciar sesión.
‫Entonces, para activar ahora esta
‫función, recuerde que debemos ejecutar un comando de guardar o crear.
‫Y ahora necesitamos crear un nuevo recorrido usando
‫nuestra API para, sí, activar este middleware.
‫Así que vayamos aquí al cartero, y comenzaré por guardar estas dos
‫nuevas rutas que creamos en las
‫conferencias anteriores, así que obtenga un plan mensual.
‫Y este de aquí es obtener estadísticas de la gira.
‫Así que ahora puedo cerrarlos y crear una nueva gira.
‫Y especificamos los datos aquí en el cuerpo.
‫Ahora bien, no todas las cosas aquí son realmente necesarias, así
‫que echemos un vistazo a lo que realmente
‫se requiere y eliminemos el resto.
‫Así que se requiere imageCover,
‫el resumen, por supuesto el precio, y sí.
‫Así que vamos a deshacernos de las cosas
‫que realmente no necesitamos aquí solo para mantenerlas al mínimo.
‫Entonces, las calificaciones, la cantidad, el promedio, por lo que
‫estos no son necesarios.
‫Así que voy a llamar
‫a este aquí el recorrido de prueba, solo para que sea realmente simple aquí.
‫Ahora enviemos esta solicitud y, de hecho, creó el
‫nuevo documento y ahora echemos un
‫vistazo a nuestra consola y veamos ese documento aquí.
‫Y de hecho, aquí está.
‫Así que aumentemos esto aquí un
‫poco y así es como se ve nuestro documento
‫justo antes de guardarlo en la base de datos.
‫Y aquí tenemos ratingsAverage y cantidad, que se
‫establecen de forma predeterminada.
‫Recuerde, entonces 4. 5 y cero, y
‫luego la marca de tiempo createdAt, e incluso
‫puede ver la propiedad virtual que definimos aquí.
‫De nuevo, esto es justo antes de que realmente guardemos
‫estos datos en la base de datos.
‫Entonces, en este momento, todavía
‫podemos actuar sobre los datos antes de que se guarden en la
‫base de datos y eso es exactamente lo
‫que haremos ahora.
‫Así que aquí abajo en nuestra función de middleware.
‫Y lo que quiero hacer aquí es crear un
‫slug para cada uno de estos documentos.
‫Así que recuerda cómo en la primera
‫sección creamos una babosa para cada uno de los
‫productos que teníamos en la tienda.
‫Entonces, un slug es básicamente una cadena
‫que podemos poner en la URL, generalmente basada en alguna
‫cadena como el nombre.
‫Entonces, en este caso, crearemos una babosa basada aquí
‫en el nombre de la gira.
‫Así que recuerda cómo usamos el paquete slugify.
‫Y ahora vamos a instalarlo.
‫Muy bien, y mientras eso está
‫funcionando, sigamos adelante y luego lo exijamos aquí.
‫Así que requiere slugify.
‫Regresemos a nuestra primera ventana aquí, en realidad.
‫Y ahora, aquí abajo, ya no queremos
‫registrar esto en la consola.
‫Pero, en cambio, ahora podemos decir esto, y
‫recuerde, este es el documento procesado actualmente.
‫Entonces ahora podemos definir una nueva propiedad en él.
‫Y eso es exactamente lo que estoy haciendo.
‫Así que esto. slug debería ser slugify,
‫y luego solo una cadena de la
‫que queremos crear un slug, y así será. name y luego también queremos pasar
‫la opción de que
‫todo debe convertirse a minúsculas, por
‫lo que es más bajo: verdadero, y ahora lo guardaré.
‫Y una cosa de la
‫que aún no hablamos es la próxima función.
‫Así que, al igual que en Express, también tenemos la siguiente función
‫en el middleware mMngoose, básicamente para llamar al siguiente
‫middleware de la pila como ya sabemos.
‫Ahora, en este caso, solo tenemos una función de
‫middleware, por lo que no tuvimos
‫ningún problema, ni siquiera llamamos a continuación, pero hagámoslo ahora.
‫Y así, cada función de middleware, en un
‫middleware previo al guardado, tiene acceso a la siguiente.
‫Eso es exactamente lo mismo que en Express, y
‫al final del middleware que llamamos a continuación, y que
‫luego llamará al siguiente middleware en
‫la pila.
‫Intentemos esto de nuevo.
‫Y esto se llamará gira de prueba número dos.
‫Muy simple, envía al
‫cielo y esperemos.
‫Y ahora, por alguna razón, no está realmente aquí.
‫Veamos si obtuvimos algún error
‫y en realidad no.
‫Pero la razón por la que no funciona
‫es que en este momento no tenemos ningún slug en nuestro esquema.
‫Y recuerde que esto realmente nos sucedió antes cuando solo
‫teníamos un par de campos en el esquema.
‫Y cuando definamos algunos campos
‫que no estaban en el esquema, simplemente
‫no se conservaron en la base de datos.
‫Y lo mismo está sucediendo ahora aquí,
‫así que definimos la propiedad slug, pero no está en nuestro esquema.
‫Y, por lo tanto, no se guardó en la base de
‫datos, así que arreglemos eso rápidamente y pongámoslo, oh,
‫no sé, realmente no importa, puede ponerlo
‫aquí justo después del nombre,
‫por lo que la babosa debería simplemente sea una cuerda.
‫Y eso debería arreglarlo.
‫Así que regresemos y creemos el recorrido de prueba número tres.
‫Porque no puede ser igual, porque recuerda que no
‫podemos tener tours con el mismo nombre.
‫Así que hazlo de nuevo, y ahora tenemos la propiedad slug
‫aquí y de hecho se basa en el nombre, como
‫puedes ver aquí.
‫Genial, volvamos aquí, vamos a reducir
‫esto un poco.
‫Y aquí tenemos el middleware previo al documento.
‫Experimentemos ahora muy rápidamente, también, con
‫un post middleware.
‫Entonces tourSchema. publicar y usemos guardar de nuevo.
‫Y luego la función de devolución de llamada, que en el
‫caso del middleware posterior tiene acceso
‫no solo al siguiente, sino también al documento que
‫se acaba de guardar en la base de datos.
‫Así que llamémoslo un documento y luego siguiente.
‫Y así, las funciones posteriores al middleware
‫se ejecutan después de que se hayan completado todas las
‫funciones anteriores al middleware, de acuerdo.
‫Así que aquí ya no tenemos la palabra clave
‫disk, sino que tenemos el documento básicamente
‫terminado aquí en doc.
‫Así que registremos ese documento terminado en la
‫consola y luego llamemos a next.
‫Ahora, en este caso, nuevamente,
‫solo tenemos un middleware de publicación y, por lo tanto, no
‫necesitaríamos el siguiente, pero es una mejor práctica simplemente incluirlo siempre.
‫Ahora, otra cosa que quería mostrarles es que
‫podemos tener, por supuesto, múltiples
‫middlewares pre o también post middlewares para el mismo gancho.
‫Y gancho es lo que llamamos a esto guardar aquí.
‫Entonces, este middleware aquí es básicamente
‫lo que llamamos un gancho previo al guardado.
‫Entonces verá esa terminología todo el tiempo.
‫Algunos lo llaman middleware y otros lo llaman ganchos.
‫Y entonces esto va a ser un gancho previo al
‫guardado o un middleware previo al guardado.
‫Así que funciona, y este tiene acceso al siguiente.
‫Así que registremos algo
‫en la consola aquí, como guardará el documento.
‫Y luego, el siguiente, y por supuesto, debería ser el siguiente.
‫Solo para ver si obtenemos
‫algún error, omitiré el siguiente aquí.
‫Solo para ver qué pasa cuando no lo llamamos.
‫Así que voy a crear
‫una nueva gira y, al final de
‫esta conferencia, las eliminaré todas, pero por ahora las necesitamos aquí.
‫Y ahora ves que realmente no está terminando, así que estamos
‫atrapados en esa función de middleware que no
‫tiene la siguiente llamada.
‫Así que básicamente estamos atrapados aquí.
‫Así que cancelemos la
‫solicitud y luego volvamos aquí, e intentemos
‫de nuevo.
‫Y ahora funcionó de verdad.
‫Entonces, nuestro slug está aquí, correcto, y echemos un vistazo
‫a nuestra consola, y de hecho, nuestro
‫segundo middleware previo también se ejecuta, por lo que
‫el único registro guardará el documento y luego
‫nuestro post middleware y luego registrará en la consola
‫el documento final, y eso
‫también debería tener la babosa y sí, aquí está.
‫Y eso es todo lo
‫que tenía que mostrarte sobre el middleware de documentos.
‫Ahora solo voy a comentar estos dos
‫aquí porque no quiero contaminar mi registro aquí todo el tiempo
‫con esta consola. registros, pero todavía
‫los guardo aquí, nuevamente, como
‫referencia.
‫Entonces, lo que quiero que recuerden de esta
‫conferencia es que podemos tener middleware ejecutándose antes
‫y después de cierto evento.
‫Y en el caso del middleware de
‫documentos, ese evento suele ser el evento de guardado.
‫Y luego, en la función de middleware en sí,
‫tenemos acceso a la palabra clave
‫disk, que apuntará al documento que se está guardando actualmente.
‫Y también es muy importante tener
‫en cuenta que este middleware de guardado solo se ejecuta para los métodos
‫de guardar y crear Mongoose.
‫No se ejecutará, por ejemplo, para insertar muchos
‫y tampoco para buscar uno y actualizar
‫o buscar por ID y actualización, que ya usamos antes.
‫Entonces, por ejemplo, en algún lugar
‫aquí tenemos findByIdAndUpdate, pero eso no activará este
‫middleware de guardado.
‫Así que es muy importante tenerlo en cuenta
‫porque en realidad un poco
‫más adelante en este proyecto, tendremos que solucionar esa limitación.
‫Muy bien, este es un software
‫intermedio de documentos para manipular documentos que se están guardando actualmente.
‫A continuación, hablaremos sobre el middleware de consultas.