‫Instructeur : Utilisons maintenant
‫un peu plus notre activité de
‫classe AppError en ajoutant quelques erreurs 404 et certaines
‫de nos fonctions de gestionnaire de tournée.
‫Maintenant, juste une chose que
‫je voulais dire avant d'implémenter réellement ces erreurs 404,
‫c'est que nous aurions bien sûr pu utiliser la fonction
‫catchAsync également dans notre routeur, d'accord ?
‫Alors, laissez-moi vous montrer comment cela fonctionnerait.
‫Donc, ici dans
‫TourRoutes, j'aurais pu encapsuler cette
‫fonction ici dans catchAsync comme ceci au lieu
‫de le faire directement ici dans le contrôleur.
‫Alors, ici où je l'ai fait en fait, non?
‫Et cela aurait eu exactement le même résultat
‫mais je ne l'ai
‫pas fait de cette façon car comme
‫ça, je dois me rappeler
‫laquelle de ces méthodes ici est
‫en fait une méthode de synchronisation, d'accord,
‫de sorte que seulement sur celles-ci j'ajoute la fonction catchAsync , droit?
‫Maintenant, dans ce cas, en fait, ils sont tous des
‫fonctions asynchrones et donc, ce n'est pas vraiment le problème ici
‫dans cet exemple, mais il y
‫aura des exemples plus tard où tous les gestionnaires ne sont pas
‫des fonctions
‫asynchrones et donc, dans ce cas,
‫j'aurais vraiment pour me rappeler lesquels d'entre eux je dois
‫encapsuler dans catchAsync et
‫lesquels ne le sont pas et
‫donc, le faire dans le contrôleur est beaucoup plus facile car
‫simplement chaque fois que
‫j'écris une fonction asynchrone ici,
‫ils le savent déjà bien, je dois encapsuler dans catchAsync.
‫D'accord.
‫Donc, je ne le fais pas
‫ici, je le fais juste comme je vous l'ai montré dans la dernière vidéo.
‫D'accord et en fait, j'ai rencontré une fois un bogue qui était
‫vraiment difficile à trouver parce
‫que j'ai en fait enveloppé une
‫fonction qui n'était pas asynchrone dans catchAsync et de sorte
‫que nous ne fonctionnions vraiment pas et que
‫je ne pouvais pas comprendre où se trouvait le
‫bogue et j'ai gaspillé beaucoup de temps sur celui-là.
‫Et donc, depuis lors, je ne mets plus catchAsync ici mais vraiment
‫près de là où j'en ai réellement
‫besoin, si près du code qui est en fait asynchrone.
‫D'accord et cela
‫étant dit, implémentons maintenant quelques erreurs 404 ici.
‫Très bien, alors je veux
‫commencer par vous montrer à nouveau l'exemple
‫que nous avons fait dans la dernière vidéo.
‫D'accord, nous avons donc essayé d'obtenir
‫une visite guidée de cet ID étrange qui n'existe
‫pas vraiment
‫et l'erreur que nous avons eue est
‫que, fondamentalement, Mongoose ne pouvait pas convertir
‫cette chaîne ici en un ID valide pour MongoDB.
‫Mais que se passe-t-il lorsque nous utilisons réellement un identifiant MongoDB valide ?
‫Donc, par exemple, ouais, copions celui-ci ici, d'accord,
‫et celui-ci
‫aura bien sûr un résultat et donc,
‫modifions-le légèrement, donc par exemple, le changer à
‫zéro ici sera toujours un identifiant
‫valide , donc ça ressemble
‫à ça et
‫ça ressemble exactement à avant,
‫je viens de
‫changer un numéro mais cet ID n'existera probablement pas.
‫Et donc, voyons ce que nous obtenons alors.
‫Et en effet, maintenant notre résultat ici est nul.
‫D'accord, et donc, ce n'est pas vraiment ce que nous voulons, n'est-ce pas ?
‫Ce que nous voulons ici, c'est afficher un code d'état 404 ici et
‫dire que cette visite n'a pas été trouvée.
‫Bon et donc, utilisons maintenant la classe orAppError
‫pour implémenter cela.
‫Gardez juste à l'esprit que
‫la tournée que nous revenons ici est nulle, d'accord ?
‫Donc, nul que nous pouvons maintenant tester.
‫Donc, si nous allons dans notre gestionnaire getTour,
‫implémentons maintenant s'il n'y a pas de tournée et dans ce cas, nous créerons une
‫erreur et cela fonctionne ici car s'il
‫n'y
‫a pas de tournée,
‫ce sera null.
‫N'oubliez pas qu'en JavaScript, null est une valeur fallacieuse, donc une
‫valeur qui sera convertie en false ici dans
‫une instruction if.
‫D'accord, et donc, s'il n'y a
‫pas de tour, alors
‫tour est faux et non faux est bien sûr
‫vrai et c'est ainsi que nous entrons dans ce bloc if.
‫Alors, qu'est-ce qu'on veut faire s'il n'y a pas de tournée ?
‫Eh bien, nous voulons créer Next avec une erreur.
‫Donc, afin de sauter directement dans l'erreur et le
‫middleware lié.
‫Donc, nous faisons une nouvelle AppError qui n'est
‫pas encore disponible, nous devons encore
‫l'importer mais utilisons-la ici tout de suite.
‫D'accord, et disons
‫simplement Aucune tournée trouvée avec cet identifiant.
‫Et puis un
‫code d'état, rappelez-vous que le deuxième argument est 404, d'accord ?
‫Maintenant, une dernière chose que nous devons
‫faire ici, c'est-à-dire retourner, d'accord parce que nous
‫voulons retourner cette fonction immédiatement et ne pas
‫passer à la ligne suivante qui serait celle-ci
‫et qui essaierait
‫alors d'envoyer deux réponses et nous a déjà rencontré cette erreur auparavant,
‫alors j'espère que vous vous en
‫souviendrez et c'est la
‫raison pour laquelle nous avons toujours besoin de revenir ici.
‫Bon, allons-y maintenant et importons rapidement l'appError et c'est
‫similaire à celui-ci ici, alors
‫dupliquons simplement.
‫D'accord, et ici c'est en fait avec un A majuscule.
‫Très bien, sauvez-le et essayons
‫à nouveau et maintenant,
‫en effet, aucune tournée n'a été trouvée avec cet ID 404.
‫Parfait, donc exactement ce que nous voulions.
‫Oh et vous avez aussi vu que nous avons l'échec ici.
‫D'accord et cela vient aussi de la classe.
‫Génial, donc cela fonctionne et j'espère vraiment que
‫vous avez maintenant compris exactement comment fonctionne maintenant toute
‫cette gestion des erreurs.
‫D'accord, donc encore une fois, nous créons une erreur et
‫nous passons ensuite cette erreur dans next
‫et dès que la prochaine reçoit quelque chose,
‫il suppose qu'il s'agit d'une erreur
‫et il
‫sautera directement dans le middleware global de gestion des
‫erreurs qui enverra ensuite la réponse pour nous , d'accord?
‫Alors, copions celui-ci
‫et plaçons-le dans tous les autres gestionnaires
‫qui interrogent les documents en fonction de l'ID.
‫Donc, ne créez pas de tournée mais mettez à jour une tournée, d'accord ?
‫Et donc,
‫ici pareil, si nous essayons de mettre
‫à jour la tournée qui
‫n'existe pas, cela nous donnera alors exactement la même erreur.
‫Enfin bien sûr la même chose avec delete.
‫Et maintenant vous voyez que ESLint m'a donné cette erreur ici
‫et donc, c'est parce que cette tournée n'est pas
‫définie et dans ce cas, ESLint m'a vraiment épargné
‫ici de créer ce bogue.
‫Droit?
‫Donc, encore une fois sans ESLint, je
‫l'aurais probablement juste collé ici et
‫l'aurais appelé un
‫jour sans même remarquer que la visite n'est définie nulle part
‫à l'intérieur de cette fonction,
‫mais puisque nous avons installé cet outil vraiment précieux, je peux
‫maintenant aller de l'avant et le réparer.
‫Très bien, donc jusqu'à
‫présent, nous avons simplement attendu cette instruction de suppression ici et n'en avons pas
‫enregistré le résultat et c'est simplement
‫parce que nous n'en avions pas besoin.
‫D'accord, mais pour le moment, nous en avons réellement
‫besoin car nous voulons cette variable de
‫tournée afin de vérifier s'il y a réellement une tournée ou non.
‫Donc, très facile, const tour et ensuite
‫égal à ce résultat,
‫donnez-lui une sauvegarde et l'erreur disparaîtra.
‫Tellement bon.
‫ESLint au travail, d'accord ?
‫Maintenant, vous avez peut-être remarqué que je n'ai pas ajouté cette erreur 404
‫ici dans ce gestionnaire getAllTour.
‫Alors, pourquoi j'ai fait ça ?
‫Et laissez-moi vous expliquer pourquoi.
‫Ainsi, lorsqu'il n'y a aucun résultat trouvé, par
‫exemple, aucun résultat ne correspond à un filtre, ou parce que la
‫page demandée n'existe pas,
‫alors bien sûr, nous pourrions envisager d'envoyer une erreur 404
‫et de dire que les données n'étaient
‫pas trouvé mais à mon avis et
‫aussi l'avis d'autres développeurs, ce n'est pas
‫tout à fait correct dans cette demande car il
‫n'y avait pas vraiment d'erreur.
‫Je veux dire, la demande a été correctement reçue.
‫La base de données a correctement recherché les
‫visites et n'a trouvé exactement aucun enregistrement
‫et donc, ces zéro enregistrement
‫sont exactement ce que nous allons renvoyer avec le code HTTP 200.
‫Très bien, donc encore une fois, je
‫considère qu'il ne peut pas vraiment y avoir d'erreur
‫lorsqu'un utilisateur demande toutes les visites à moins bien
‫sûr qu'il y ait une défaillance dans la base de données ou
‫quelque chose comme ça.
‫Mais dans ce
‫cas, Mongoose lancera alors automatiquement une erreur.
‫D'accord, qui à son tour va être intercepté par notre
‫fonction ou catchAsync et comme vous
‫le savez déjà, géré
‫dans notre gestionnaire d'erreurs global et comme vous le
‫savez déjà,
‫géré dans notre middleware de gestion des erreurs globales.
‫Très bien, alors j'ai déjà dit ces mots tant de fois.
‫Quoi qu'il en soit, j'espère que
‫cela avait du sens et donc, ouais, passons maintenant à autre chose.