‫Narrateur : Dans cette vidéo, nous
‫allons parler du deuxième type de middleware Mongoose, qui
‫est le middleware de requête.
‫Et, comme son nom l'indique,
‫le middleware de requête nous permet d'exécuter des fonctions
‫avant ou après l'exécution d'une certaine requête.
‫Et donc ajoutons maintenant un crochet de
‫pré-recherche, donc fondamentalement, un middleware qui va s'exécuter
‫avant qu'une requête de recherche ne soit exécutée.
‫Ajoutons donc un autre commentaire ici.
‫Il s'agit donc d'un middleware de requête.
‫Et bien sûr, cela fonctionne de la même
‫manière qu'avant.
‫Donc le tourSchema, puis pre, et ici nous
‫définissons le crochet, qui va être
‫"trouver. "
‫Alors, fonction, et encore, nous avons
‫accès à la fonction suivante.
‫Et effectivement, commençons par l'appeler
‫ici à la fin pour ne pas l'oublier.
‫D'accord, et vous voyez, cela
‫ressemble exactement à l'autre middleware,
‫l'autre pré-crochet.
‫La seule différence ici est vraiment ce crochet de recherche, qui
‫fera de ce middleware de requête et
‫non un middleware de document.
‫D'accord?
‫Et donc, la grande différence ici
‫est que le mot-clé this pointera désormais vers la requête actuelle et
‫non vers le document actuel,
‫car nous ne traitons pas vraiment de documents ici.
‫Nous allons vraiment traiter une requête.
‫D'accord?
‫Et le cas d'utilisation que nous allons faire ici est le suivant.
‫Supposons donc que nous puissions avoir
‫des visites secrètes dans notre base de données,
‫comme pour des visites qui ne sont proposées qu'en interne, ou
‫pour un très petit groupe de personnes, comme un groupe VIP, et
‫que le public ne devrait pas connaître.
‫Maintenant, puisque ces tournées sont secrètes,
‫nous ne voulons pas que les tournées secrètes apparaissent dans les
‫sorties de résultat.
‫Droit?
‫Et donc ce que nous allons faire, c'est créer un champ
‫de visite secret, puis interroger uniquement les visites qui ne sont pas secrètes.
‫D'accord?
‫Alors, faisons-le.
‫Commencez par ajouter ici, et faisons-le correctement à la fin.
‫secretTour, donc le type devrait être un booléen, et je pense
‫que c'est la première
‫fois que nous utilisons un
‫booléen, donc ce serait vrai ou faux.
‫Donc si c'est vrai, alors
‫c'est une tournée secrète, et nous
‫ne voulons pas qu'elle apparaisse, et, par défaut, c'est faux.
‫D'accord?
‫Et donc, au fond, les visites ne sont généralement pas secrètes.
‫D'accord.
‫Ensuite, allons de l'avant et créons une visite secrète afin
‫que nous puissions ensuite tester son utilisation, d'accord ?
‫Appelons cela ici le Super Secret Tour.
‫Tout cela n'a
‫pas d'importance, et permettez-moi simplement de dire que secretTour est en effet vrai.
‫D'accord?
‫Enregistrez-le ici...
‫Et, euh, où est-ce ?
‫Oui. Donc secretTour est vrai.
‫Et passons maintenant à Compass et
‫supprimons toutes ces autres tournées que nous avons eues là-bas.
‫Alors, rechargeons ça...
‫Et puis, ici-bas, on aurait dû...
‫Ouais, cette tournée d'essai ici, on peut la supprimer.
‫Encore une tournée test...
‫Donc, tout ce fouillis ici, en
‫gros, nous voulons nous en débarrasser.
‫Nous ne gardons que le secretTour
‫ici afin que nous puissions maintenant l'expérimenter.
‫D'accord, et vous voyez ici que secretTour est défini sur true, tandis
‫que les autres, bien
‫sûr, n'ont pas cet attribut,
‫car, au moment où nous les avons
‫créés, nous n'avions pas encore le secretTour.
‫Alors, maintenant, juste avant de commencer,
‫de retour dans Postman, confirmons qu'en effet, la dernière tournée
‫ici, et en fait ce n'est pas la dernière tournée, alors
‫où est-elle ?
‫Ah, c'est le premier.
‫Nous avons donc ici le Super Secret Tour,
‫bien sûr, réglé sur vrai.
‫D'accord? Donc, revenons en arrière maintenant, exécutons
‫maintenant la requête comme nous venons
‫de le dire au début.
‫Donc, encore une fois, gardez à l'esprit qu'il s'agit
‫maintenant d'un objet de requête, d'accord ?
‫Et ainsi, nous pouvons enchaîner toutes les méthodes
‫dont nous disposons pour les requêtes.
‫Et donc cela ajoute simplement une méthode de
‫recherche ici, puis sélectionnez
‫fondamentalement tous les documents où secretTour n'est pas vrai, d'accord ?
‫Tellement secretTour...
‫Et puis n'est pas égal à vrai.
‫Et je le fais comme ça
‫parce que, rappelez-vous, les éditeurs ne sont pas actuellement réglés sur false.
‫Ils n'ont tout simplement pas cet attribut.
‫D'accord?
‫Bon, alors testons-le à nouveau maintenant.
‫Et donc il devrait maintenant être parti ici.
‫Et effectivement, il n'est plus là.
‫D'accord, nous avons toutes les visites qui ne sont pas secrètes,
‫mais pas la visite secrète.
‫Et je vois maintenant que
‫nous avons en fait secretTour défini sur
‫false ici, mais c'est vraiment juste un
‫truc de Mongoose, alors jetons un autre coup d'œil ici à Compass,
‫et rechargeons.
‫Et donc vous voyez qu'en fait, dans
‫la base de données, secretTour n'est pas défini sur false.
‫Mongoose ajoute simplement cela parce que nous l'avons dans notre
‫schéma par défaut, et ce n'est pas dans la base de données.
‫Et donc c'est fondamentalement, alors, le mettre là de toute façon.
‫Vous voyez donc que nous avons en fait
‫11 documents, mais ici, dans Postman, nous n'obtenons que dix résultats.
‫Et c'est,
‫bien sûr, parce que notre visite secrète est essentiellement filtrée.
‫D'accord?
‫Essayons donc de comprendre à nouveau ce
‫qui se passe réellement.
‫Donc, dès que nous atteignons cette route, ici,
‫en utilisant la méthode
‫get, voyons ce qui se passe.
‫Donc, ce qui se passe, c'est que nous créons une
‫requête en utilisant tour. trouve.
‫D'accord?
‫Et puis, bien sûr, nous lui enchaînons
‫toutes ces méthodes comme nous en avons parlé dans
‫l'une des dernières
‫conférences, puis, à la fin, nous exécutons cette requête ici en utilisant wait.
‫Droit? Vous vous en souvenez ?
‫C'est donc ici que nous exécutons la requête.
‫Mais, avant qu'il ne
‫soit réellement exécuté, notre middleware de pré-recherche ici est exécuté.
‫D'accord?
‫Et il est exécuté parce qu'il
‫est trouvé, tout comme nous l'avons utilisé ici.
‫Droit?
‫Donc, nous créons une requête de
‫recherche, et donc, par conséquent, le crochet de recherche est ensuite exécuté.
‫Ensuite, ici, puisqu'il s'agit d'un middleware de requête, le
‫mot-clé this pointe vers la requête.
‫Et donc, à cette requête, nous pouvons
‫ensuite enchaîner une autre méthode de recherche, n'est-ce pas ?
‫Et là-dedans, nous filtrons ensuite le secretTour en utilisant
‫cet objet de filtre.
‫D'accord?
‫Donc, en gros, dire que nous ne voulons
‫que des visites où le secretTour n'est pas égal à vrai.
‫Et cela fonctionnerait en fait
‫de la même manière si nous disions
‫simplement ici, faux, mais je trouve cela plus propre comme ça.
‫D'accord, il n'y a maintenant qu'une chose que nous devons corriger,
‫car pour le moment ce middleware
‫s'exécute pour find, mais pas pour find1.
‫D'accord?
‫Alors laissez-moi vous montrer le problème que nous pourrions avoir avec cela.
‫Alors, euh, prenons l'ID de la tournée secrète.
‫Nous avons donc
‫la tournée secrète ici, et c'est son identifiant, et donc si nous avons une
‫tournée, cela devrait nous donner la tournée super secrète ici.
‫Droit?
‫Et donc vous voyez que
‫ce filtre que nous venons de construire dans
‫le middleware ne fonctionne pas pour cette commande.
‫D'accord?
‫Et c'est parce que la fonction de gestion
‫de cet itinéraire,
‫comme vous vous en souvenez peut-être, utilise findByID, qui, dans les
‫coulisses, est find1, et c'est donc différent de find.
‫D'accord?
‫Nous devons donc spécifier le même middleware également pour find1.
‫Maintenant, il y a
‫deux façons de le faire, et la première serait
‫simplement d'aller de l'avant, de copier ce code, puis de mettre find1 ici.
‫Mais ce n'est pas vraiment bon, et
‫donc à la place, nous allons utiliser une expression régulière.
‫Et c'est assez facile, et donc...
‫Et permettez-moi en fait de dupliquer
‫ceci ici, de
‫commenter ce morceau, puis, rappelez-vous, une expression régulière commence
‫et se termine par une barre oblique.
‫Et puis ici, ce que je
‫veux dire, c'est que ce
‫middleware doit être exécuté non seulement pour
‫find, mais pour toutes les commandes qui commencent par le nom find.
‫D'accord?
‫Donc, find et find1, et aussi find1 et delete, find1
‫et update, et
‫donc tout cela déclenchera maintenant cette fonction
‫middleware que nous avons ici.
‫D'accord?
‫Donc, pas besoin de ça.
‫Cette expression régulière ici est bien meilleure.
‫Encore une fois, cela
‫signifie simplement ici toutes les chaînes qui commencent par find.
‫Et en fait, puisque nous sommes ici,
‫permettez-moi de vous montrer à nouveau les documentations de Mongoose.
‫Ainsi, lorsque nous irons ici, au middleware dans ces guides, vous aurez alors
‫un aperçu de tous les middleware.
‫Par exemple,
‫le middleware de document est celui dont nous avons
‫parlé précédemment, qui s'exécute, par exemple, lors de la sauvegarde.
‫Mais en fait, le middleware de
‫document peut également s'exécuter pour des choses comme la suppression.
‫D'accord?
‫Ou pour valider.
‫D'accord, mais je n'en ai pas parlé
‫car généralement celui que nous utilisons toujours est juste pour sauvegarder.
‫Désormais, le middleware de requête peut s'exécuter pour toutes
‫ces fonctions de requête.
‫Donc find, comme nous venons de le
‫spécifier, et maintenant, avec notre
‫expression régulière, ça
‫va aussi s'exécuter pour find1,
‫findOneAndDelete, findOneAndRemove et findOneAndUpdate.
‫Quoi qu'il en soit, revenant à Postman
‫maintenant, cela devrait maintenant avoir résolu cette situation ici.
‫Ainsi, lorsque nous exécutons maintenant cette requête, elle
‫ne devrait avoir aucun résultat.
‫Et en effet, ce n'est pas le cas.
‫Parce que, rappelez-vous, nous essayions d'obtenir un Tour secret.
‫Ainsi, la visite avec cet ID ici est
‫secrète, mais nous ne voulons jamais que les
‫visites secrètes s'affichent dans aucune requête.
‫Et c'est pourquoi, en ce moment, nous n'obtenons aucun résultat.
‫D'accord?
‫Donc ça marche maintenant.
‫N'enregistrez pas cela,
‫et maintenant, revenons à notre code.
‫Spécifions maintenant en fait
‫également un post middleware pour find.
‫Alors, tourSchema, puis, comme avant, postez, puis utilisons à nouveau notre
‫expression régulière ici pour tout ce
‫qui commence par find.
‫Et puis juste une fonction normale,
‫et puis ici, dans le middleware post-find, nous
‫avons en fait accès à tous les documents que
‫nous avons renvoyés à partir de la requête.
‫Alors appelons ça Docs.
‫D'accord?
‫Alors, n'oubliez pas que ce middleware va
‫s'exécuter après que la requête ait déjà été exécutée.
‫Et donc, par conséquent, il peut avoir
‫accès aux documents qui lui ont été restitués.
‫Encore une fois, parce que cette
‫requête est en fait déjà terminée à ce stade.
‫Alors enregistrons ces documents sur la console, donc
‫docs,
‫mais je veux aussi faire autre chose ici.
‫Donc, en gros, créons, en quelque sorte, une
‫horloge pour mesurer le temps qu'il faut pour
‫exécuter la requête en cours.
‫D'accord?
‫Alors, comment allons-nous faire ?
‫Eh bien, assez simple.
‫Nous pouvons simplement définir une propriété sur cet objet,
‫car cet objet de requête n'est en réalité qu'un objet normal.
‫Bien sûr, il a accès à toutes ces méthodes, telles
‫que find, mais
‫nous pouvons également l'utiliser pour
‫définir n'importe quelle propriété que nous voulons dessus.
‫Donc, encore une fois, juste un objet normal.
‫Et donc ici, nous pouvons dire ceci. début doit
‫être la date du jour.
‫D'accord?
‫Et donc cela le définira
‫comme l'heure actuelle en millisecondes, d'accord ?
‫Et donc, ici, dans le post middleware, qui va
‫s'exécuter après l'exécution de la requête, nous pouvons
‫alors soustraire l'heure actuelle moins
‫l'heure de début.
‫Alors consolez-vous. log, la
‫requête a pris et
‫maintenant la date actuelle moins
‫celle-ci.
‫début, millisecondes.
‫D'accord, faisons une sauvegarde, et
‫essayons maintenant d'exécuter une requête et de voir nos résultats.
‫D'accord?
‫Donc, nous avons ici toutes nos tournées,
‫nous avons ici la
‫console, et mettons cela au clair.
‫Il y a plein de trucs là-dedans.
‫Redemandez, et
‫voici donc tous les résultats.
‫Donc, en gros, ce sont toutes les tournées qui ont été trouvées, et
‫c'est donc le résultat de la console. log de la doc.
‫Donc, en gros, les documents qui correspondent à la requête.
‫Mais je m'intéresse maintenant à cette première console. log, et donc,
‫ici, nous voyons "La requête a pris 120 millisecondes", et c'était
‫donc essentiellement le temps qui
‫s'est écoulé depuis le début, où nous
‫l'avons défini, jusqu'à l'exécution de la requête, à ce moment-là.
‫D'accord.
‫Et c'est tout ce que j'avais à vous
‫montrer pour l'instant sur le middleware
‫de requête, et comme
‫avant, bien sûr, nous allons beaucoup
‫l'utiliser tout
‫au long du cours, car, comme je l'ai
‫mentionné au début, le middleware est vraiment un concept
‫fondamental c'est vraiment important pour beaucoup de choses
‫dont nous avons besoin dans nos applications.
‫Nous avons donc presque fini de parler de middleware.
‫Ensuite vient le dernier, qui
‫est le middleware d'agrégation.