‫Narrador: En este video, hablaremos sobre
‫el segundo tipo de middleware Mongoose, que es
‫el middleware de consultas.
‫Y, como su nombre lo indica,
‫el middleware de consultas nos permite ejecutar funciones antes o
‫después de que se ejecute una determinada consulta.
‫Y ahora agreguemos un gancho de búsqueda
‫previa, básicamente, un middleware que se ejecutará antes
‫de que se ejecute cualquier consulta de búsqueda.
‫Así que agreguemos otro comentario aquí.
‫Así que este es el middleware de consultas.
‫Y, por supuesto, funciona de forma muy similar a como
‫lo hacía antes.
‫Entonces el tourSchema, y luego pre, y
‫aquí definimos el gancho, que será
‫"encontrar".
‫"Entonces, función, y nuevamente, tenemos
‫acceso a la siguiente función.
‫Y de hecho, comencemos llamándolo
‫aquí al final para que no lo olvidemos.
‫Bien, y como puede ver, se
‫ve exactamente como el otro middleware,
‫el otro pre-hook.
‫La única diferencia aquí es realmente este gancho de búsqueda, que
‫hará que esta consulta sea un middleware
‫y no un documento de middleware.
‫¿Está bien?
‫Entonces, la gran diferencia aquí es
‫que la palabra clave this ahora apuntará a la consulta actual y
‫no al documento actual,
‫porque en realidad no estamos procesando ningún documento aquí.
‫Realmente vamos a estar procesando una consulta.
‫¿Okey?
‫Y el caso de uso que vamos a hacer aquí es este.
‫Entonces, supongamos que podemos tener
‫recorridos secretos en nuestra base de
‫datos, como recorridos que solo se ofrecen internamente, o
‫para un grupo muy pequeño, como VIP, de personas, y
‫que el público no debería conocer.
‫Ahora, dado que estos recorridos son
‫secretos, no queremos que los recorridos secretos aparezcan nunca en las
‫salidas de resultados.
‫¿Derecha?
‫Entonces, lo que vamos a hacer es crear un campo
‫de recorrido secreto y luego consultar solo los recorridos que no son secretos.
‫¿Está bien?
‫Entonces, hagámoslo.
‫Comience agregando aquí, y hagámoslo al final.
‫secretTour, por lo que el tipo debería ser un booleano, y creo
‫que esta es la
‫primera vez que usamos un
‫booleano, por lo que sería verdadero o falso.
‫Entonces, si es cierto,
‫entonces es un recorrido secreto, y
‫no queremos que se muestre y, por defecto, es falso.
‫¿Está bien?
‫Y así, básicamente, los recorridos no suelen ser secretos.
‫Bueno.
‫A continuación, sigamos adelante y creemos un recorrido secreto para
‫que luego podamos probar su uso, ¿de acuerdo?
‫Así que llamemos a esto aquí el Tour Súper Secreto.
‫Todo esto
‫no importa, y permítanme decirles que secretTour es verdad.
‫¿Okey?
‫Guárdalo aquí ...
‫Y, uh, ¿dónde está eso?
‫Sí. Tan secretTour es verdad.
‫Y ahora vayamos a Compass
‫y eliminemos todos estos otros recorridos que tuvimos allí.
‫Entonces, recarguemos esto ...
‫Y luego, aquí abajo, deberíamos haber ...
‫Sí, este recorrido de prueba aquí, podemos eliminarlo.
‫Otro recorrido de prueba ...
‫Así que todo este desorden aquí,
‫básicamente, queremos deshacernos de él.
‫Solo guardamos el tour secreto aquí
‫para que ahora podamos experimentar con él.
‫De acuerdo, y aquí ves que secretTour está configurado como
‫verdadero, mientras que
‫los otros, por supuesto,
‫no tienen este atributo, porque, cuando
‫los creamos, aún no teníamos secretTour.
‫Entonces, ahora, justo antes de comenzar,
‫de vuelta en Postman, confirmemos que, de hecho, la última
‫gira aquí, y en realidad no es la última gira,
‫entonces, ¿dónde está?
‫Oh, es el primero.
‫Así que aquí tenemos el Tour Súper Secreto,
‫por supuesto, establecido en verdad.
‫¿Está bien? Entonces, retrocediendo ahora, ejecutemos
‫la consulta como dijimos
‫al principio.
‫Entonces, nuevamente, tenga en cuenta que este es
‫ahora un objeto de consulta, ¿de acuerdo?
‫Y así podemos encadenar todos los métodos
‫que tenemos para las consultas.
‫Y eso simplemente agrega un método de búsqueda
‫aquí, y luego básicamente
‫selecciona todos los documentos donde secretTour no es verdadero, ¿de acuerdo?
‫Tan secretTour ...
‫Y luego no es igual a verdadero.
‫Y lo estoy haciendo así
‫porque, recuerde, los editores actualmente no están configurados como falso.
‫Simplemente no tienen este atributo.
‫¿Está bien?
‫Bien, probémoslo ahora de nuevo.
‫Y ahora debería haber desaparecido aquí.
‫Y de hecho, ya no está aquí.
‫De acuerdo, tenemos todos los tours que no son secretos,
‫pero no el tour secreto.
‫Y ahora veo que
‫en realidad tenemos secretTour configurado como
‫falso aquí, pero eso es solo una
‫cosa de Mongoose, así que echemos otro vistazo aquí a Compass
‫y recarguemos.
‫Y entonces ve que, en realidad, en
‫la base de datos, secretTour no está configurado como falso.
‫Mongoose simplemente está agregando eso porque lo tenemos en nuestro
‫esquema como predeterminado y no está en la base de datos.
‫Entonces, básicamente, es ponerlo allí de todos modos.
‫Verá que en realidad tenemos 11
‫documentos, pero aquí en Postman solo obtenemos diez resultados.
‫Y eso
‫es, por supuesto, porque nuestro Tour Secreto básicamente está filtrado.
‫¿Okey?
‫Entonces, intentemos comprender nuevamente lo
‫que realmente sucede.
‫Tan pronto como lleguemos a esta ruta,
‫aquí, usando el
‫método get, veamos qué sucede.
‫Entonces, lo que sucede es que creamos una
‫consulta usando tour. encontrar.
‫¿Okey?
‫Y luego, por supuesto, le encadenamos
‫todos estos métodos como hablamos en una de
‫las últimas
‫conferencias, y luego, al final, ejecutamos esa consulta aquí usando await.
‫¿Derecha? ¿Recuérdalo?
‫Entonces aquí es donde ejecutamos la consulta.
‫Pero, antes de que realmente
‫se ejecute, entonces, se ejecuta nuestro middleware de búsqueda previa.
‫¿Okey?
‫Y se ejecuta porque se
‫encuentra, tal como lo usamos aquí.
‫¿Derecha?
‫Entonces, estamos creando una consulta
‫de búsqueda y, por lo tanto, se ejecuta el gancho de búsqueda.
‫Luego, aquí, dado que es un middleware de consultas, esta
‫palabra clave apunta a la consulta.
‫Entonces, a esa consulta,
‫podemos encadenar otro método de búsqueda, ¿verdad?
‫Y allí, luego filtramos el secretTour usando
‫este objeto de filtro.
‫¿Okey?
‫Básicamente, decir que solo queremos recorridos en
‫los que el recorrido secreto no sea igual a verdadero.
‫Y en realidad
‫funcionaría igual si simplemente dijéramos
‫aquí, falso, pero lo encuentro más limpio así.
‫Bien, ahora solo hay una cosa que debemos arreglar, porque
‫ahora mismo este middleware se está
‫ejecutando para find, pero no para find1.
‫¿Okey?
‫Déjame mostrarte el problema que podríamos tener con eso.
‫Entonces, eh, tomemos la identificación del Tour Secreto.
‫Entonces tenemos el
‫Tour Secreto aquí, y esa es su identificación, y si lo hacemos,
‫entonces eso debería darnos el Tour Súper Secreto aquí.
‫¿Derecha?
‫Y como puede ver,
‫ese filtro que acabamos de construir en
‫el middleware no funciona para este comando.
‫¿Okey?
‫Y eso se debe a que la función
‫de control para
‫esta ruta, como recordará, usa findByID, que, detrás de escena,
‫es find1, por lo que es diferente de find.
‫¿Está bien?
‫Entonces, necesitamos especificar el mismo middleware también para find1.
‫Ahora, hay dos
‫formas de hacerlo, y la primera sería
‫simplemente seguir adelante, copiar este código y luego poner find1 aquí.
‫Pero eso no es realmente bueno,
‫por lo que en su lugar usaremos una expresión regular.
‫Y eso es bastante fácil, y entonces ...
‫Y permítanme duplicar esto aquí,
‫comentar esta
‫pieza y luego, recuerde, una expresión regular
‫comienza y termina con una barra.
‫Y luego aquí, lo que quiero
‫decir es que este
‫middleware debe ejecutarse no solo para
‫find, sino para todos los comandos que comienzan con el nombre find.
‫¿Okey?
‫Entonces, busque y busque1, y también busque1 y elimine, busque1
‫y actualice, y
‫todos estos ahora activarán esta función
‫de middleware que tenemos aquí.
‫¿Está bien?
‫Entonces, no hay necesidad de eso.
‫Esta expresión regular aquí es mucho mejor.
‫Entonces, nuevamente, esto
‫aquí simplemente significa todas las cadenas que comienzan con find.
‫Y de hecho, ya que estamos
‫aquí, permítanme mostrarles las documentaciones de Mongoose nuevamente.
‫Entonces, cuando vayamos aquí, al middleware en estas guías, tendrá una
‫descripción general de todo el middleware.
‫Por ejemplo,
‫el middleware de documentos es del que hablamos
‫antes, que se ejecuta, por ejemplo, al guardar.
‫Pero, de hecho, el middleware de
‫documentos también se puede ejecutar para cosas como remove.
‫¿Está bien?
‫O para validar.
‫De acuerdo, pero no hablé de
‫estos porque generalmente el que usamos siempre es solo para guardar.
‫Ahora, el middleware de consultas puede ejecutarse para todas
‫estas funciones de consulta.
‫Así que busque, como acabamos de
‫especificar, y ahora, con nuestra
‫expresión regular, también
‫se ejecutará para find1,
‫findOneAndDelete, findOneAndRemove y findOneAndUpdate.
‫De todos modos, volviendo a Postman
‫ahora, esto debería haber solucionado esta situación aquí.
‫Entonces, cuando ejecutamos esta consulta, no
‫debería tener resultados.
‫Y de hecho, no es así.
‫Porque, recuerde, estábamos tratando de obtener un Tour secreto.
‫Entonces, el recorrido con esta identificación aquí
‫es secreto, pero nunca queremos que el
‫recorrido secreto aparezca en ninguna consulta.
‫Y por eso, ahora mismo, no obtenemos ningún resultado.
‫¿Okey?
‫Entonces eso funciona ahora.
‫No guarde esto, y
‫ahora, de vuelta a nuestro código.
‫Ahora vamos a especificar
‫también un middleware de publicación para find.
‫Entonces, tourSchema, y luego, como antes, post, y luego usemos nuestra
‫expresión regular aquí nuevamente para cualquier
‫cosa que comience con find.
‫Y luego solo una función
‫normal, y luego aquí, en el middleware posterior
‫a la búsqueda, en realidad obtenemos acceso a todos
‫los documentos que devolvimos de la consulta.
‫Así que llamémoslo Docs.
‫¿Está bien?
‫Por lo tanto, recuerde que este middleware se
‫ejecutará después de que la consulta ya se haya ejecutado.
‫Y así, por tanto, puede tener
‫acceso a los documentos que le fueron devueltos.
‫Nuevamente, porque esa consulta
‫ya ha finalizado en este momento.
‫Así que registremos estos documentos en la consola,
‫así
‫que docs, pero también quiero hacer algo más aquí.
‫Básicamente, creemos una especie de
‫reloj para medir cuánto tiempo lleva
‫ejecutar la consulta actual.
‫¿Está bien?
‫Entonces, ¿cómo vamos a hacer eso?
‫Bueno, bastante simple.
‫Simplemente podemos establecer una propiedad en este objeto,
‫porque este objeto de consulta es realmente un objeto normal.
‫Por supuesto que tiene acceso a todos estos métodos,
‫como find, pero
‫también podemos usarlo para
‫establecer cualquier propiedad que queramos en él.
‫Entonces, nuevamente, solo un objeto regular.
‫Y aquí podemos decir esto. inicio debe
‫ser la fecha actual.
‫¿Okey?
‫Y entonces esto lo establecerá
‫como la hora actual en milisegundos, ¿de acuerdo?
‫Y entonces, aquí, en el middleware posterior, que se ejecutará
‫después de que se haya ejecutado la consulta, podemos
‫restar la hora actual menos la
‫hora de inicio.
‫Así que consola. log, consulta
‫tomó, y ahora
‫la fecha actual menos
‫esto.
‫inicio, milisegundos.
‫Bien, vamos a guardarlo, y
‫ahora intentemos ejecutar una consulta y ver nuestros resultados.
‫¿Okey?
‫Entonces, aquí tenemos todos nuestros recorridos,
‫aquí tenemos la
‫consola, y aclaremos eso.
‫Hay muchas cosas ahí.
‫Solicite de nuevo,
‫y aquí están todos los resultados.
‫Básicamente, estos son todos los recorridos que se encontraron, y ese
‫es el resultado de la consola. registro de los documentos.
‫Básicamente, los documentos que coincidían con la consulta.
‫Pero ahora estoy interesado en esta primera consola. log, y entonces,
‫aquí vemos "La consulta tomó 120 milisegundos", y ese fue básicamente
‫el tiempo que pasó desde
‫el principio, donde definimos esto, hasta después
‫de que la consulta se ha ejecutado, en este momento.
‫Está bien.
‫Y eso es todo lo que tenía que
‫mostrarte por ahora sobre el
‫middleware de consultas, y
‫al igual que antes, por supuesto
‫que lo
‫usaremos mucho a lo largo del curso,
‫porque, como mencioné al principio, el middleware es realmente
‫un concepto fundamental. eso es realmente importante para
‫muchas cosas que necesitamos en nuestras aplicaciones.
‫Así que casi hemos terminado de hablar de middleware.
‫El siguiente es el último, que
‫es el middleware de agregación.