‫Instructeur : Tout comme
‫Express, Mongoose a également le concept de middleware.
‫Et donc, découvrons maintenant le premier
‫type de middleware, qui est le middleware de document.
‫Maintenant, tout comme avec Express, nous pouvons utiliser le
‫middleware Mongoose pour faire en sorte que quelque chose
‫se produise entre deux événements.
‫Par exemple, chaque fois qu'un nouveau document est
‫enregistré dans la base de données, nous
‫pouvons exécuter une fonction entre l'émission de la commande
‫d'enregistrement et l'enregistrement réel du document, ou également après l'enregistrement réel.
‫Et c'est la raison pour laquelle le
‫middleware Mongoose est également appelé pré et post hooks.
‫Encore une fois, parce que nous pouvons définir
‫des fonctions à exécuter avant ou après un certain événement, comme l'enregistrement
‫d'un document dans la base de données.
‫Le middleware est donc un concept absolument fondamental dans
‫Mongoose, tout comme dans Express.
‫Et il y a des tonnes
‫de possibilités et de cas d'utilisation pour les middlewares, et
‫nous allons utiliser des middlewares tout le temps dans ce projet.
‫Il existe donc quatre types de middleware dans
‫Mongoose : middleware de document, de requête, d'agrégat et de modèle.
‫Et dans cette conférence, nous allons
‫parler du middleware de document, qui est
‫un middleware qui peut agir sur le document en cours de traitement.
‫Donc tout comme les propriétés virtuelles, on
‫définit un middleware sur le schéma,
‫donc tourSchema. pré.
‫Et c'est donc pour le pré middleware, qui, encore
‫une fois, va s'exécuter avant un événement réel.
‫Et cet événement dans ce cas est l'événement de sauvegarde.
‫Et donc cette fonction de rappel
‫que nous allons
‫définir ici
‫ensuite, donc cette fonction sera appelée avant qu'un document réel ne soit
‫enregistré dans la base de données.
‫Il s'agit donc d'un middleware de document, et il
‫fonctionne, laissez-moi écrire tout cela ici.
‫Il s'exécute donc avant la commande save et
‫le fichier . créer la commande.
‫Mais pas sur insérer beaucoup.
‫Donc, si nous utilisons cette commande ici, donc insertMany, cela ne
‫déclenchera en fait pas le middleware de sauvegarde.
‫Gardez donc toujours cela à l'esprit.
‫Il est très important de réaliser que ce n'est qu'à la
‫sauvegarde et à la création que ce middleware ici
‫va être exécuté.
‫Et commençons donc par faire une console simple. log et ce que
‫je vais enregistrer via la console est le suivant.
‫Et donc dans un middleware de sauvegarde, le mot-clé disk ici
‫va pointer vers le document en cours de traitement.
‫Et c'est la raison pour laquelle on l'appelle middleware de document.
‫Encore une fois, car dans cette
‫fonction là, on a accès au document qui est en cours de traitement.
‫Donc, dans ce cas, le document qui est enregistré.
‫Et permettez-moi donc de vous montrer très rapidement cela en
‫utilisant cette console. Journal.
‫Et donc pour déclencher maintenant cette fonction,
‫rappelez-vous que nous devons exécuter une commande de sauvegarde ou une commande de création.
‫Et donc nous devons maintenant créer une nouvelle tournée en utilisant
‫notre API afin, oui, de déclencher ensuite ce middleware.
‫Allons donc ici au facteur, et je vais commencer par enregistrer ces
‫deux nouveaux itinéraires que nous avons
‫créés dans les conférences précédentes, alors obtenez un plan mensuel.
‫Et celui-ci ici est d'obtenir des statistiques de tournée.
‫Alors maintenant, je peux les fermer et créer une nouvelle tournée.
‫Et nous spécifions les données ici dans le corps.
‫Maintenant, toutes les choses ici ne sont pas réellement
‫nécessaires, alors examinons ce qui est réellement
‫nécessaire et débarrassons-nous du reste.
‫Il faut donc l'imageCover,
‫le résumé, bien sûr le prix, et ouais.
‫Alors débarrassons-nous des choses dont nous n'avons
‫pas vraiment besoin ici, juste pour les garder au minimum.
‫Donc les notes, la quantité, la moyenne, donc ce
‫ne sont pas nécessaires.
‫Donc je vais juste appeler
‫celui-ci ici la tournée d'essai, juste pour que ce soit vraiment simple ici.
‫Envoyons maintenant cette demande et en effet, il
‫a créé le nouveau document et
‫regardons maintenant notre console et voyons ce document ici.
‫Et en effet, le voici.
‫Alors augmentons un peu cela ici
‫et voici à quoi ressemble notre document
‫juste avant d'être enregistré dans la base de données.
‫Et donc ici, nous avons des notesMoyenne et quantité,
‫qui sont définies par défaut.
‫Rappelez-vous, donc 4. 5 et zéro, puis
‫l'horodatage createdAt, et vous pouvez même voir la
‫propriété virtuelle que nous avons définie ici.
‫Encore une fois, c'est juste avant que nous enregistrions réellement
‫ces données dans la base de données.
‫Et donc à ce stade,
‫nous pouvons toujours agir sur les données avant qu'elles ne soient enregistrées dans
‫la base de données et c'est exactement ce que
‫nous allons faire maintenant.
‫Donc ici dans notre fonction middleware.
‫Et ce que je veux faire ici, c'est créer
‫un slug pour chacun de ces documents.
‫Alors rappelez-vous comment dans la première section,
‫nous avons créé un slug pour chacun des produits
‫que nous avions en magasin.
‫Et donc un slug est fondamentalement juste
‫une chaîne que nous pouvons mettre dans l'URL, généralement basée sur
‫une chaîne comme le nom.
‫Donc dans ce cas, nous allons créer un slug basé
‫ici sur le nom de la tournée.
‫Alors rappelez-vous comment pour cela nous avons utilisé le package slugify.
‫Et donc allons-y maintenant et installons-le.
‫Très bien, et pendant ce
‫temps, allons de l'avant et exigeons-le ici.
‫Il faut donc slugify.
‫Revenons à notre première fenêtre ici, en fait.
‫Et maintenant, ici-bas, nous ne voulons plus
‫enregistrer cela sur la console.
‫Mais au lieu de cela, nous pouvons maintenant dire ceci,
‫et n'oubliez pas qu'il s'agit du document actuellement traité.
‫Nous pouvons donc maintenant définir une nouvelle propriété dessus.
‫Et c'est exactement ce que je fais.
‫Donc ça. slug devrait être slugify, puis
‫juste une chaîne à partir de laquelle nous
‫voulons créer un slug, et ça va être ça. name , puis nous voulons également
‫transmettre l'option que tout doit
‫être converti en minuscules, et c'est donc
‫plus bas : true, et maintenant je vais le sauvegarder.
‫Et une chose dont nous
‫n'avons pas encore parlé est la fonction suivante.
‫Ainsi, tout comme dans Express, nous avons également la fonction suivante dans
‫le middleware mMngoose, essentiellement pour appeler le prochain middleware de
‫la pile, comme nous le savons déjà.
‫Maintenant, dans ce cas, nous n'avons qu'une seule
‫fonction middleware, c'est pourquoi nous n'avons
‫rencontré aucun problème, même pas d'appel suivant, mais faisons-le maintenant.
‫Et ainsi, chaque fonction middleware, dans
‫un middleware pré-sauvegardé, a accès à la suivante.
‫C'est donc exactement la même chose que dans Express, et
‫donc à la fin du middleware que nous appelons next, et
‫qui appellera alors le middleware suivant
‫dans la pile.
‫Essayons donc à nouveau.
‫Et ça s'appellera la tournée d'essai numéro deux.
‫Très simple, envoyez à
‫sky, et attendons.
‫Et maintenant, pour une raison quelconque, ce n'est pas vraiment ici.
‫Voyons si nous avons une erreur, et
‫ce n'est pas le cas.
‫Mais la raison pour laquelle cela ne fonctionne
‫pas est qu'en ce moment nous n'avons aucun slug dans notre schéma.
‫Et rappelez-vous que cela nous est déjà arrivé lorsque nous
‫n'avions que quelques champs dans le schéma.
‫Et lorsque nous définirons certains champs
‫qui n'étaient pas dans le schéma, ils n'étaient
‫tout simplement pas conservés dans la base de données.
‫Et la même chose se produit maintenant ici,
‫nous avons donc défini la propriété slug, mais ce n'est pas dans notre schéma.
‫Et donc il n'a pas été enregistré dans la base de données,
‫et donc corrigeons cela rapidement et mettons-le, oh, je
‫ne sais pas, ça n'a pas vraiment d'importance,
‫peut le mettre ici juste après
‫le nom, donc le slug devrait être simplement une chaîne.
‫Et donc ça devrait arranger ça.
‫Revenons donc en arrière et créons la tournée d'essai numéro trois.
‫Parce que ça ne peut pas être le même, parce que rappelez-vous que
‫nous ne pouvons pas avoir de tournées avec le même nom.
‫Alors recommencez, et maintenant, en effet, nous avons la propriété slug ici et
‫elle est en effet basée sur le nom, comme vous pouvez
‫le voir ici.
‫Super, alors revenons ici, allons réduire
‫un peu ça.
‫Et donc ici, nous avons le middleware pré-document.
‫Expérimentons maintenant très rapidement, également, avec
‫un post middleware.
‫Alors tourSchema. post et utilisons à nouveau save.
‫Et puis la fonction de rappel, qui dans le cas
‫du post middleware a accès
‫non seulement au suivant, mais aussi au document
‫qui vient d'être enregistré dans la base de données.
‫Appelons-le donc un doc, puis le suivant.
‫Et donc les fonctions post middleware
‫sont exécutées une fois que toutes les fonctions
‫pré middleware sont terminées, d'accord.
‫Donc, ici, nous n'avons plus le mot-clé disk, mais à
‫la place, nous avons le document essentiellement
‫terminé ici dans la doc.
‫Alors, enregistrons simplement ce document terminé sur la
‫console, puis appelons le suivant.
‫Maintenant, dans ce cas encore, nous
‫n'avons qu'un seul middleware de poste et nous n'aurions donc pas vraiment
‫besoin du suivant, mais c'est une bonne pratique de toujours l'inclure simplement.
‫Maintenant, une autre chose que je voulais vous montrer est
‫que nous pouvons avoir, bien sûr,
‫plusieurs pré middlewares ou également post middlewares pour le même crochet.
‫Et hook est ce que nous appelons cette sauvegarde ici.
‫Donc, ce middleware ici est essentiellement
‫ce que nous appelons un hook de pré-sauvegarde.
‫Vous verrez donc cette terminologie tout le temps.
‫Donc, certains l'appellent middleware, et certains l'appellent crochets.
‫Et donc cela va être un crochet de
‫pré-sauvegarde ou un middleware de pré-sauvegarde.
‫Alors fonction, et celui-ci a accès au suivant.
‫Et donc, enregistrons simplement quelque
‫chose dans la console ici, comme enregistrer le document.
‫Et puis ensuite, et cela bien sûr, devrait être le suivant.
‫Juste pour voir si nous obtenons
‫une erreur, je vais omettre la suivante ici.
‫Juste pour voir ce qui se passe quand on ne l'appelle pas.
‫Je vais donc créer une nouvelle
‫tournée, et à la fin de cette conférence,
‫je vais toutes les supprimer, mais pour l'instant nous en avons besoin ici.
‫Et maintenant, vous voyez que ce n'est pas vraiment terminé, nous
‫sommes donc coincés dans cette fonction middleware qui
‫n'a pas l'appel suivant.
‫Donc, fondamentalement, nous sommes coincés ici.
‫Annulons donc la
‫demande, puis récupérons-la ici, et
‫réessayez.
‫Et maintenant, cela a effectivement fonctionné.
‫Notre slug est donc ici, à droite, et jetons donc
‫un coup d'œil à notre console, et
‫donc en effet, notre deuxième pré middleware fonctionne également,
‫donc la seule journalisation enregistrera le document, puis
‫notre post middleware puis connecté à la console le document
‫final, et donc ça devrait
‫aussi déjà avoir la limace et ouais, la voilà.
‫Et c'est en fait tout ce
‫que j'avais à vous montrer sur le middleware de document.
‫Maintenant, je vais juste commenter ces deux ici parce
‫que je ne veux pas polluer mon journal ici tout le temps
‫avec ces consoles. logs, mais je les
‫garde toujours ici, encore une fois,
‫comme référence.
‫Donc, ce que je veux que vous reteniez de cette conférence,
‫c'est que nous pouvons avoir un middleware en cours d'exécution
‫avant et après un certain événement.
‫Et dans le cas d'un middleware
‫de document, cet événement est généralement l'événement de sauvegarde.
‫Et puis dans la fonction middleware elle-même, nous avons
‫accès au mot-clé disk, qui
‫va pointer vers le document en cours de sauvegarde.
‫Et il est également très important de
‫garder à l'esprit que ce middleware de sauvegarde ne s'exécute que pour les méthodes de
‫sauvegarde et de création de Mongoose.
‫Cela ne fonctionnera pas, par exemple, pour insérer plusieurs et pas
‫non plus pour en trouver un et mettre à jour
‫ou rechercher par ID et mettre à jour, ce que nous avons déjà utilisé auparavant.
‫Ainsi, par exemple, nous avons quelque part ici,
‫nous avons findByIdAndUpdate, mais cela ne déclenchera pas ce
‫middleware de sauvegarde.
‫C'est donc très important à garder à l'esprit
‫car en fait, un peu
‫plus tard dans ce projet, nous devrons contourner cette limitation.
‫Très bien, il s'agit donc
‫d'un middleware de document pour manipuler les documents en cours d'enregistrement.
‫Ensuite, nous allons parler de l'intergiciel de requête.