‫Instructeur : Il s'agit donc de
‫la deuxième partie du calcul des statistiques d'examen.
‫Cette fois, pour quand un avis est mis à jour ou supprimé.
‫Et cette partie est en fait un peu
‫plus difficile car, gardez à l'esprit
‫qu'un avis est mis à jour ou
‫supprimé à l'aide
‫de findByIdAndUpdate ou également de findByIdAndDelete, n'est-ce pas ?
‫Donc, pour ceux-ci, nous n'avons en fait pas de middleware de
‫document, mais seulement un middleware de requête, d'accord.
‫Et donc dans la requête, nous n'avons en
‫fait pas d'accès direct au document pour ensuite faire quelque
‫chose de similaire à ça, d'accord.
‫Parce que, rappelez-vous, nous avons besoin d'accéder à l'examen en cours,
‫de sorte qu'à partir de là, nous puissions extraire
‫l'ID de la tournée, puis calculer les statistiques à partir de là, d'accord,
‫mais encore une fois, pour ces
‫crochets ici, nous n'avons qu'un middleware de requête, d'accord.
‫Mais permettez-moi maintenant de vous
‫montrer une astuce intéressante pour contourner cette limitation.
‫Nous allons donc implémenter
‫un pré-middleware pour ces crochets, pour ces événements essentiellement.
‫Donc pre, et encore une fois, je vais utiliser
‫une expression régulière pour une chaîne commençant
‫par findOneAnd et c'est tout.
‫Et donc
‫celui-ci va alors fonctionner pour findOneAndUpdate,
‫et findOneAndDelete car, rappelez-vous
‫qu'en coulisse, findByIdAndUpdate n'est qu'un
‫raccourci pour findOneAndUpdate avec l'ID actuel, à droite.
‫Donc, ici, nous devons en fait
‫utiliser les crochets middleware findOneAndDelete et findOneAndUpdate, d'accord.
‫Donc, fonction, et il obtient le mot-clé suivant car
‫il s'agit d'un pré-middleware.
‫Donc, rappelez-vous que l'objectif est d'accéder au
‫document de révision actuel, d'accord,
‫mais ici, ce mot-clé est la requête actuelle.
‫Maintenant, comment allons-nous contourner cela?
‫Eh bien, nous pouvons essentiellement exécuter une requête,
‫puis cela nous donnera le document
‫en cours de traitement.
‫Donc, pour ce faire, nous pouvons utiliser findOne.
‫Et c'est tout.
‫Alors tout ce que nous avons à faire est d'attendre cette requête,
‫puis de l'enregistrer quelque part.
‫Appelons-le donc r, qui va être révisé, d'accord.
‫Ensuite, enregistrez-le en tant que async.
‫Et c'est tout.
‫Et juste pour nous assurer que
‫cela fonctionne ici, enregistrons-le pour l'instant sur la console, d'accord.
‫Donc, sans faire de calculs, tout ce
‫qui nous intéresse vraiment,
‫c'est de voir si cette belle astuce fonctionne ici.
‫Donc, fondamentalement, l'astuce consistant à contourner cela dans
‫un middleware de requête,
‫nous n'avons accès qu'à la requête.
‫Encore une fois, nous devons accéder au document
‫et nous exécutons donc essentiellement cette requête en
‫utilisant findOne.
‫Très bien, mettons donc à jour une critique, et mettons donc à
‫jour la dernière que nous avons faite, très bien,
‫et la note,
‫maintenant, fixons-la à quatre.
‫C'était donc cinq
‫avant et maintenant nous le changeons à quatre.
‫Il
‫a donc envoyé cela, et voici la critique.
‫Maintenant, bien sûr, la note est toujours fixée
‫à cinq à ce stade, car ce findOne ici obtient
‫vraiment le document de la base de données,
‫et donc à ce moment-là, en pré, il n'y
‫avait toujours pas de modifications dans la base de données, et
‫donc c'était cinq avant,
‫et maintenant ça va toujours être cinq.
‫Mais cela n'a pas vraiment
‫d'importance ici car tout ce qui nous intéresse, c'est cette pièce d'identité.
‫En fait, cet identifiant de tournée, c'est ça,
‫parce que c'est ce
‫dont nous aurons besoin pour calculer les notes moyennes.
‫D'accord, et maintenant, utilisons cette fonction.
‫D'accord, maintenant, réfléchissons à cela car
‫si nous devions utiliser cette fonction calcAverageRatings à ce
‫stade, nous
‫calculerions les statistiques en utilisant
‫les données non mises à jour, d'accord.
‫Et c'est exactement la même raison pour laquelle ici,
‫nous devions également utiliser post et non pre, d'accord, car
‫ce n'est qu'une fois que le document est déjà enregistré
‫dans la base de données
‫qu'il est logique de calculer les notes.
‫Et donc ici, c'est exactement la même chose,
‫à la grosse différence qu'on ne peut pas simplement
‫changer ce pre en post.
‫Nous ne pouvons donc pas le faire car à ce
‫stade, nous n'avons plus accès à la requête car
‫la requête a déjà été exécutée, d'accord, et donc sans la
‫requête, nous ne
‫pouvons pas enregistrer le document de révision,
‫et nous ne pouvons donc pas exécuter cette fonction.
‫Donc, c'est vraiment déroutant, je comprends, mais j'ai vraiment décidé de
‫créer cette conférence de cette manière parce que, eh
‫bien, c'est vraiment la seule
‫solution à ce problème, et c'est un très
‫bon exercice pour que vous compreniez fondamentalement cette Hello Experience.
‫Donc, la solution pour cela est maintenant d'utiliser
‫post, donc, reviewSchema, puis fondamentalement la même
‫chose, alors copions simplement tout cela, rendons-nous la vie
‫un peu plus facile, débarrassons-nous de cela
‫et débarrassons-nous du Suivant.
‫Ici, nous devons également appeler ensuite,
‫d'accord, mais nous le faisons ensuite par la poste, d'accord.
‫Et maintenant, à ce
‫moment-là, donc après que la requête soit
‫déjà terminée, et donc que l'examen ait été mis à
‫jour, c'est un moment parfait
‫où nous pouvons ensuite appeler cette fonction.
‫Alors, calculez les notes moyennes.
‫Mais d'où obtenons-nous maintenant l'identifiant de la tournée ?
‫Eh bien, nous allons devoir utiliser
‫une astuce qui consiste essentiellement à transmettre des données du
‫pré-middleware au post middleware.
‫Et donc au lieu d'enregistrer ce document dans une simple variable,
‫nous allons l'enregistrer dans celle-ci. r.
‫Donc, en gros, nous créons une propriété sur cette variable.
‫D'accord, et maintenant ici, nous avons toujours accès à cela.
‫Et maintenant, nous pouvons dire ceci. r, qui rappelez-vous est l'examen,
‫puis . visiter.
‫Donc, c'est encore une fois assez déroutant, mais encore une
‫fois assez amusant une fois que vous comprenez comment
‫cela fonctionne vraiment, d'accord.
‫Maintenant, encore une fois, nous avons besoin de quelque chose
‫comme ça ici pour appeler cette fonction ici
‫car rappelez-vous qu'il s'agit en
‫fait d'une méthode statique, et nous devons donc l'appeler sur le modèle.
‫Maintenant, où est ce modèle dans ce cas?
‫Eh bien, c'est à ça. r, qui est dans ce
‫cas, équivalent à
‫ceci ceci ici dans ce middleware,. constructeur. calcAverageRatings.
‫Woo, ça a l'air assez écrasant, n'est-ce pas ?
‫Bien sûr, nous devons l'attendre, c'est pourquoi nous l'avons
‫déclaré asynchrone, d'accord.
‫Donc, encore une fois, nous avons essentiellement utilisé cette façon ici de transmettre
‫les données du pré-middleware au post middleware, et donc ici
‫nous avons récupéré le document
‫de révision à partir de cette variable.
‫D'accord, et encore une fois, nous avons dû le faire
‫de cette manière car à ce moment-là, la requête était déjà exécutée, et
‫nous ne pouvions
‫donc pas le faire ici.
‫Et écrivons cela en fait ;
‫ne fonctionne PAS ici, la requête a déjà été exécutée.
‫Génial, et avec cela, nous devrions maintenant
‫être prêts à tester cela.
‫Alors allons de l'avant et mettons à jour
‫celui-ci ici une fois de plus, et définissons-le sur une note de un, d'accord.
‫Jetons maintenant un coup d'œil ici, jusqu'à ce que vous voyiez que le nombre d'évaluations est
‫toujours de cinq, mais la moyenne
‫n'est plus que de trois, et maintenant la question est
‫de savoir si cela s'est vraiment mis à jour
‫également sur la tournée, et, oui, en effet,
‫il l'a fait .
‫Donc, cinq notes avec une moyenne de trois.
‫Super, mettons maintenant à jour un autre.
‫Alors, pour cela, récupérons tous nos avis, et
‫en fait nous ne voulons pas tous,
‫mais seulement le dernier.
‫Et là, j'ai toujours ce
‫filtre, donc je devrais m'en débarrasser, donc
‫nous obtenons tous
‫les 65 résultats, donc tous ces avis, mais nous ne voulons que les derniers,
‫donc ceux que nous venons de créer.
‫Alors mettons à jour...
‫Je ne suis pas sûr, car en fait, ils ne sont pas en ordre ici.
‫Allons, d'accord, nous avons donc ici les plus récents.
‫Alors permettez-moi maintenant de mettre à jour celui-ci ici, disons, quatre,
‫juste comme test final, et cela devrait donc
‫augmenter un peu la moyenne.
‫Et en effet, il l'a fait.
‫Số 3. 6 maintenant, et bien sûr, le nombre est toujours
‫cinq parce que vous n'avez pas ajouté de nouvelle critique.
‫Donc, cela fonctionne très bien sur la mise à jour,
‫testons-le maintenant également avec la suppression.
‫Alors allons-y et supprimons l'examen que nous
‫venons de mettre à jour et donc maintenant nous devrions être réduits
‫à seulement quatre, et en effet, nous y sommes.
‫Alors maintenant, seulement quatre.
‫Et supprimons en fait tous.
‫Donc, celui-ci est le suivant.
‫Ah, nous y sommes.
‫Puis aussi celui-ci.
‫Donc, maintenant, nous
‫devrions être à trois seulement ou, en fait,
‫il ne nous en reste plus que deux avec une moyenne de quatre.
‫Voyons donc lequel il nous reste.
‫C'est donc celui-ci avec trois et celui-ci avec cinq.
‫Et c'est pourquoi nous avons cette moyenne de quatre.
‫Alors débarrassons-nous de celui-ci et maintenant notre moyenne devrait
‫être de cinq, n'est-ce pas ?
‫Ou en fait trois parce que le seul qui reste
‫en a trois.
‫Et maintenant, le test final, en supprimant le dernier,
‫juste pour voir ce qui se passera une fois que nous aurons fait cela.
‫Et, nous obtenons une erreur ici.
‫Donc, impossible de lire la propriété nRating de non défini.
‫C'est donc calcAverageRatings à la ligne 69.
‫Donc, je ne sais pas ce que c'est.
‫Donc, ligne 69, et donc, c'est ce problème ici.
‫Nous essayons donc de lire nRating de non défini.
‫Donc, la statistique zéro est fondamentalement indéfinie.
‫Et c'est parce que s'il n'y a pas
‫de document correspondant à cette requête ici, eh bien,
‫nous récupérons simplement un tableau vide.
‫Et c'est en fait exactement ce que nous avons ici.
‫C'est donc le tableau de statistiques et pour le moment, il
‫n'a aucun résultat, d'accord, nous ne devrions
‫donc exécuter ce morceau de code ici que chaque fois que nous
‫avons réellement quelque chose dans le tableau de statistiques.
‫Alors faisons-le.
‫Donc si statistiques. la longueur est
‫supérieure à zéro, eh bien, alors faites ceci.
‫Et sinon, eh bien, cela signifie essentiellement que toutes
‫nos critiques ont disparu, eh bien, nous voulons essentiellement
‫revenir à la valeur par défaut.
‫Nous allons donc le régler sur la
‫quantité de zéro et la moyenne de 4. 5, qui n'oubliez pas, est la valeur par défaut lorsqu'il n'y
‫a aucun avis.
‫Alors créons rapidement une nouvelle critique, et ça
‫peut être ça, d'accord, donc nous revenons
‫à une
‫note, et maintenant la supprimons tout de suite, juste pour
‫tester ce morceau
‫de code que nous venons d'écrire, juste pour le voir ici ainsi,
‫donc une note, en moyenne cinq.
‫Et maintenant, lorsque nous le
‫supprimons, nous n'obtenons plus d'erreur.
‫Et sur notre tournée, nous sommes
‫revenus à zéro et à un défaut de 4. 5.
‫D'accord, d'accord, d'accord, parfait.
‫Prenons donc à nouveau juste une petite seconde
‫ici pour récapituler ce que nous venons de faire.
‫Ainsi, pour pouvoir exécuter cette fonction ici
‫également lors de la mise à jour et de la suppression,
‫nous devons en fait utiliser le middleware de
‫requête que Mongoose nous fournit pour ces situations.
‫Bon, donc, nous n'avons pas de middleware
‫de document pratique, qui fonctionne, pour ces fonctions, mais à la
‫place nous devons utiliser
‫le middleware de requête, et dans celui-ci,
‫nous n'avons pas directement accès au document actuel.
‫Et donc nous devons contourner
‫cela en utilisant ce findOne ici, et
‫donc essentiellement en récupérant le document actuel à partir de la base de données.
‫Nous le stockons ensuite sur la variable
‫de requête actuelle, et voilà, et en faisant cela, nous
‫y avons ensuite accès dans le post middleware.
‫Et ce n'est alors que dans le post middleware que nous
‫calculons réellement les statistiques des avis.
‫Et rappelez-vous que nous procédons de cette façon, car si nous
‫le faisions correctement dans
‫cette fonction middleware, les données sous-jacentes n'auraient pas été
‫mises à jour à ce stade et les
‫statistiques calculées ne seraient donc pas vraiment à jour.
‫Et c'est pourquoi nous avons utilisé ce processus
‫en deux étapes ici essentiellement.
‫Maintenant, débarrassons-nous de cette console. log ici, puisque nous avons terminé maintenant, et aussi
‫de ces statistiques.
‫Donc, j'espère que c'était amusant pour vous
‫et pas trop accablant.
‫J'ai conçu cet exercice spécifiquement pour que
‫nous puissions résoudre un problème commercial réel
‫en utilisant tous les outils que Mongoose nous donne.
‫Et donc, avec cela, j'espère que vous avez appris un
‫peu mieux à travailler avec tous ces différents
‫middlewares dans différentes situations chaque fois que cela
‫est nécessaire dans une situation réelle.
‫Donc, excellent travail pour avoir terminé cette
‫conférence assez difficile et pour être toujours avec moi à ce stade du cours.
‫C'est vraiment bon pour moi de voir, donc j'en
‫suis vraiment content.
‫Mais de toute façon, il y a encore du contenu plus
‫intéressant à venir dans cette section en fait, et passons maintenant ensemble,
‫directement à la vidéo suivante.