‫Instructeur : Dans cette conférence, implémentons un meilleur
‫moyen de détecter les erreurs dans toutes nos fonctions asynchrones.
‫Alors maintenant, dans toutes nos fonctions asynchrones,
‫nous avons ces blocs try catch, n'est-ce pas ?
‫Alors, rappelez-vous comment nous avons ajouté à toutes ces fonctions de gestion
‫cet essai, puis ce bloc catch, d'accord ?
‫Et donc toutes ont ceci parce que
‫toutes sont des fonctions asynchrones et c'est
‫ainsi que nous attrapons généralement les erreurs à
‫l'intérieur d'une fonction asynchrone.
‫Donc, en utilisant un bloc try catch.
‫Maintenant, cela donne vraiment à notre code un aspect désordonné et flou,
‫donc le but de cette méthode createTour ici, par exemple,
‫est simplement d'exécuter ce code.
‫En fait, nous ne voulons
‫pas gâcher la
‫gestion des erreurs ici, donc en ce moment nous avons
‫ces deux blocs supplémentaires, essayez et attrapez,
‫et avec cela vient cette indentation
‫supplémentaire ici et encore, cela rend vraiment notre code pas propre.
‫Ce n'est vraiment pas concentré.
‫De plus, nous avons beaucoup de code en
‫double ici car dans chacun de
‫ces gestionnaires, nous avons un bloc catch assez similaire.
‫Donc, dans tout cela, tout ce
‫que nous faisons est vraiment d'envoyer cette réponse.
‫Et cette réponse ne serait même pas envoyée
‫ici, mais plutôt dans notre middleware global de gestion des erreurs,
‫rappelez-vous, mais c'est un autre sujet.
‫Pour l'instant, ce que j'essaie
‫de me concentrer ici, c'est que ces blocs
‫try catch à l'intérieur de chacune de nos fonctions asynchrones ne sont
‫pas idéaux et essayons donc maintenant de résoudre ce problème.
‫Et la solution consiste essentiellement à retirer le bloc try
‫catch d'ici et à le placer à un niveau
‫supérieur dans une autre fonction.
‫Donc, en gros, ce
‫que nous allons
‫faire, c'est créer une fonction, puis envelopper cette fonction asynchrone dans cette fonction.
‫D'accord?
‫Et permettez-moi donc d'appeler celui-ci catchAsync.
‫Donc catchAsync, et je l'appelle de cette façon
‫car le but de
‫cette fonction est simplement d'attraper nos erreurs asynchrones.
‫Si simple, non ?
‫Donc, dans cette fonction
‫catchAsync, nous allons passer une fonction, d'accord ?
‫Et rappelez-vous, la fonction que nous allons
‫transmettre est essentiellement celle-ci.
‫Alors maintenant que nous travaillons avec cet
‫exemple, la fonction que nous allons passer dans le catchAsync est
‫cette fonction car c'est là que nous
‫voulons intercepter les erreurs asynchrones.
‫Alors faisons-le en fait.
‫Donc fn, puis enveloppez toute cette fonction là-dedans.
‫Donc, ensuite, ce que nous devons faire
‫est d'appeler cette fonction ici.
‫Appelez-la donc, et cette fonction devrait recevoir
‫une demande, une réponse et, en fait, également la suivante.
‫Donc, celui-ci ici devrait également avoir next et tous les autres,
‫car rappelez-vous, nous
‫avons besoin de la fonction next afin
‫de lui transmettre l'erreur afin que
‫cette erreur puisse ensuite être gérée
‫dans le middleware global de gestion des erreurs.
‫Donc, toutes ces fonctions vont avoir besoin
‫d'une requête, d'une réponse et ensuite.
‫Mais laissons cela pour plus tard.
‫Pour l'instant, concentrons-nous vraiment sur notre catchAsync ici.
‫Donc cette fonction ici que nous avons passée à
‫async, qui est maintenant appelée fn ici,
‫est une fonction asynchrone.
‫Et rappelez-vous que les fonctions
‫asynchrones renvoient des promesses, n'est-ce pas ?
‫Et lorsqu'il y a une erreur dans
‫une fonction asynchrone, cela signifie essentiellement que la promesse est rejetée.
‫Et donc ici, là où nous appelons réellement cette fonction,
‫nous pouvons alors détecter cette erreur.
‫Nous l'attrapons donc ici, au lieu
‫de l'attraper dans le bloc try catch.
‫Donc catch, et error, puis ensuite, et transmettez l'erreur.
‫Et nous
‫pouvons simplifier cela, mais pour l'instant, supprimons le bloc try
‫catch ici, et concentrons-nous donc simplement sur cette pièce.
‫C'est donc tout
‫ce que nous voulons et nous n'avons plus besoin du
‫bloc try catch, encore une fois, car ce catch est maintenant essentiellement
‫transféré ici, sur cette ligne.
‫Ce n'est plus un bloc
‫catch, car ici, il est simplement
‫plus facile d'utiliser la promesse renvoyée par la fonction fn.
‫Encore une fois, cette fonction fn est cette fonction, donc celle
‫que nous avons transmise à catchAsync, et
‫qui va donc renvoyer une promesse.
‫Et en fait, j'ai remarqué ici
‫que cela, bien sûr, devrait s'appeler catchAsync, d'accord ?
‫Et puis donc cette fonction
‫que nous avons passée à catchAsync, celle-ci est bien sûr alors fn.
‫D'accord?
‫Donc l'argument que nous avons fait passer là-dedans.
‫Maintenant, il y a en fait deux gros problèmes avec la
‫façon dont cela est mis en œuvre en ce
‫moment et donc de cette façon, cela ne fonctionnerait pas vraiment du tout.
‫Donc, tout d'abord, cet appel de
‫fonction ici n'a aucun moyen de connaître la demande, la réponse et ensuite.
‫Nous ne les avons pas transmis à catchAsync ici, et il
‫n'y a donc vraiment aucun
‫moyen pour la fonction de connaître les valeurs de ces paramètres.
‫Et deuxièmement, ici, nous
‫appelons en fait la fonction asynchrone.
‫Et pour voir cela un peu mieux, débarrassons-nous
‫simplement complètement de ce code.
‫Nous avons donc ici catchAsync et nous l'appelons ensuite en
‫utilisant les parenthèses bien sûr.
‫Et puis, à l'intérieur de catchAsync, nous appelons également
‫tout de suite la fonction fn, et ce n'est pas
‫comme cela que cela est censé fonctionner.
‫Donc, createTour ici devrait vraiment être une fonction mais
‫pas le résultat de l'appel d'une fonction.
‫Mais c'est en ce moment ce qui se passe.
‫Donc en ce moment
‫catchAsync est appelé, qui appelle ensuite cette fonction ici, d'accord ?
‫Et encore une fois, cette fonction ne doit pas
‫être appelée, mais à la place, elle doit
‫rester ici et attendre qu'express l'appelle.
‫Et express l'appellera bien
‫sûr dès que quelqu'un emprunte la
‫route qui a besoin de cette fonction de contrôle.
‫Et donc la solution à cela est de faire en sorte
‫que la fonction catchAsync renvoie une autre fonction qui
‫sera ensuite affectée à createTour et que cette
‫fonction puisse ensuite être
‫appelée plus tard si nécessaire.
‫Alors faisons-le ici.
‫Renvoyons donc une fonction anonyme et
‫rappelons-nous que c'est la fonction
‫qu'express va ensuite appeler.
‫Et c'est donc ici que nous
‫spécifions ensuite la demande, la réponse et ensuite.
‫Il manque en fait la flèche ici.
‫Et bien.
‫Et c'est en fait ça.
‫C'est notre fonction catchAsync.
‫Rappelez-vous juste comment j'ai dit que
‫nous pouvions le simplifier et c'est juste
‫parce que, en JavaScript, nous pouvons le simplifier
‫comme ça donc tout ce que nous devons passer
‫ici est la fonction, et elle sera
‫ensuite appelée automatiquement avec le paramètre que ce rappel reçoit.
‫C'est donc la même chose que d'écrire ensuite.
‫Récapitulons donc ici.
‫Ainsi, afin de nous débarrasser de nos blocs try
‫catch, nous avons simplement encapsulé notre
‫fonction asynchrone dans la fonction catchAsync que nous venons de créer.
‫Cette fonction renverra alors une nouvelle fonction
‫anonyme, qui
‫est celle-ci ici, qui sera alors affectée à createTour.
‫Et donc fondamentalement, c'est cette fonction
‫ici qui sera appelée dès qu'un nouveau
‫tour doit être créé à l'aide du gestionnaire createTour.
‫Et c'est pourquoi elle a exactement la
‫même signature ici que cette fonction asynchrone, avec requête, réponse et suivant.
‫Maintenant, ce que cette fonction ici fera
‫alors, c'est qu'elle appellera la
‫fonction que nous avons transmise initialement,
‫donc celle-ci ici,
‫et elle exécutera ensuite tout le code qui s'y trouve.
‫Maintenant, puisqu'il s'agit d'une fonction asynchrone
‫ici, elle renverra une
‫promesse et donc, en cas d'erreur dans cette promesse
‫ou en d'autres termes, en cas de rejet,
‫nous pouvons alors détecter l'erreur qui s'est produite
‫en utilisant la méthode catch qui est disponible sur toutes les promesses.
‫Et au final, c'est cette méthode catch ici qui
‫va transmettre l'erreur à la fonction suivante qui fera ensuite
‫en sorte que notre erreur
‫se retrouve dans notre middleware global de gestion des erreurs.
‫C'est donc ici, cette ligne de
‫code, que toute la magie opère, et c'est
‫en fait ce qui nous
‫permet de nous débarrasser du bloc catch que nous avions auparavant.
‫Et une
‫remarque: c'est assez compliqué à comprendre et au cas où
‫ce n'est pas clair à 100%, ne vous inquiétez
‫pas, ce n'est pas si important que ça.
‫Il s'agit vraiment de déterminer comment fonctionne
‫exactement le code asynchrone dans les coulisses de JavaScript.
‫Il ne s'agit donc pas vraiment d'express ou de Node. js, il
‫s'agit davantage du fonctionnement du code asynchrone.
‫Quoi qu'il en soit, si nous créons maintenant
‫un nouveau tour
‫et qu'une erreur se produit, par exemple,
‫à partir d'une entrée invalide, alors cette erreur devrait
‫bien sûr être interceptée ici
‫dans cette fonction catch, et sera ensuite propagée à notre
‫middleware de gestion des erreurs et de sorte que on renverra
‫ensuite la réponse d'erreur que nous sommes censés recevoir.
‫Et donc, essayons maintenant.
‫Alors créez une nouvelle tournée.
‫Ici, nous avons le
‫corps, et débarrassons-nous maintenant d'un de ces champs obligatoires.
‫D'accord.
‫Et donc cela devrait déclencher une erreur, et voyons donc.
‫Et en effet, notre validation de tournée a échoué, ce
‫qui est exactement le message
‫d'erreur que nous étions censés recevoir.
‫Maintenant, ici, vous voyez cette erreur de serveur interne 500, qui est
‫simplement due au fait qu'à l'heure actuelle,
‫l'erreur qui s'est propagée au
‫middleware de gestion
‫des erreurs n'avait aucun code d'état spécifié et
‫rappelez-vous donc que notre valeur par défaut est 500
‫et c'est donc celui-ci qui a ensuite été renvoyé.
‫Et bien sûr, nous devons corriger
‫cela et nous le ferons dans une conférence ultérieure de ce cours.
‫Pour l'instant, ce qui compte
‫ici, c'est que premièrement, notre fonction catchAsync fonctionne comme prévu,
‫et deuxièmement, que l'erreur s'est réellement propagée, elle a
‫donc été détectée par notre middleware global de gestion
‫des erreurs qui a ensuite renvoyé cette réponse au client.
‫Maintenant, allons de l'avant et exportons cette
‫fonction catch dans son propre fichier.
‫Je le récupère donc d'ici et
‫je vais créer juste un autre fichier
‫dans notre dossier utilitaires.
‫Donc catchAsync. js.
‫Et jusqu'ici, module. les exportations devraient être juste cela.
‫Et donc ça devrait très bien fonctionner.
‫De retour dans notre contrôleur de tournée,
‫nous devons bien sûr maintenant importer cette fonction.
‫Et comme d'habitude, nous devons remonter
‫d'un dossier, puis dans notre dossier
‫utilitaires, puis catchAsync.
‫Très bien, et maintenant tout
‫ce que nous avons à faire est de nous débarrasser
‫de tous ces blocs catch et d'encapsuler tous les gestionnaires dans le catchAsync.
‫Alors faisons-le.
‫Faites d'abord l'emballage, puis débarrassez-vous de ces blocs.
‫Faites une sauvegarde pour reformater, et c'est parti.
‫Et maintenant, il s'agit simplement de répéter cela
‫jusqu'à ce que toutes les tournées, ou, désolé, jusqu'à
‫ce que tous les gestionnaires aient terminé.
‫OK, sauvegarde rapide.
‫Celui-ci est déjà fait.
‫La prochaine étape est la mise à jour.
‫Et il n'en manque plus qu'un.
‫Ou en fait, ce n'est pas vrai.
‫Là-bas, nous avons encore plus de fonctions asynchrones.
‫Nous allons donc nous débarrasser de la capture et de l'essai ici.
‫Et je crois que celui-ci est le dernier.
‫Et oui, c'est vrai.
‫Très bien, maintenant une autre chose que
‫nous devons faire est en fait d'ajouter à côté d'eux tous ici également.
‫Mais bien sûr, pas en majuscule.
‫D'accord.
‫Et permettez-moi en fait de les sélectionner tous ici
‫afin que je n'aie qu'à l'écrire une fois.
‫Et donc cela l'a ajouté à tous.
‫Et maintenant, je suppose que nous en avons fini avec cette partie.
‫Testons-le à nouveau très rapidement, pas avec celui-ci,
‫mais ici avec, pas avec celui-ci
‫aussi, donc c'est fini.
‫Et je vais essayer d'avoir
‫une tournée mais avec une pièce d'identité invalide, alors voyons ce qui se passe ici.
‫Et en effet, nous obtenons notre message
‫d'erreur et à nouveau avec le code d'état 500,
‫ce qui n'est pas correct,
‫rappelez-vous, mais nous
‫allons nous en occuper plus tard.
‫Alors maintenant, laissez-moi vous montrer que c'est ici
‫que vient le 500 car pour le moment il n'y a pas de
‫code d'état à l'intérieur de l'erreur
‫que nous obtenons parce que
‫ces erreurs, elles viennent en fait de Mongoose et donc
‫nous n'avons aucun moyen
‫d'ajouter un statut code à ces erreurs.
‫Ou en fait, bien sûr, nous pourrions le faire, mais
‫ce serait encore plus déroutant et nous allons
‫donc trouver un autre moyen plus tard
‫dans cette section.
‫Pour l'instant, je suis vraiment content du résultat que nous
‫avons ici et c'est tout pour cette conférence.