‫- : Ainsi, comme je
‫l'ai mentionné dans la dernière vidéo, il
‫existe trois types d'erreurs pouvant être
‫créées par Mongoose dans lesquelles nous devons marquer comme
‫erreurs opérationnelles afin de pouvoir renvoyer des messages d'erreur significatifs
‫aux clients en production.
‫Et commençons maintenant par simuler ces trois erreurs, d'accord ?
‫Donc, le premier est lorsque nous essayons un ID invalide ici,
‫donc simplement quelque chose
‫comme ça, et donc Mongoose ne pourra pas
‫le convertir en un ID MongoDB, souvenez-vous-en.
‫Et c'est donc l'erreur que nous obtenons en ce moment, et en
‫fait, ici vous pouvez voir tout le genre de
‫choses que nous avons définies que nous voulions voir dans les productions.
‫Donc tout l'objet d'erreur, puis le message d'erreur,
‫et aussi la pile complète, d'accord ?
‫Et c'est donc un parfait exemple
‫d'erreur opérationnelle.
‫C'est donc quelque chose qui pourrait très
‫bien arriver, et nous devons donc renvoyer une réponse
‫significative afin de gérer cette erreur.
‫Et c'est un exemple parfait d'une erreur opérationnelle qui est très
‫susceptible d'arriver à un moment donné à un client, et donc, nous devons
‫la gérer comme une seule, d'accord ?
‫Donc, en gros en envoyant un joli message d'erreur au
‫lieu de quelque chose comme ça,
‫ce qui ne veut rien dire pour aucun client, n'est-ce pas ?
‫D'accord, le but ici encore
‫sera de marquer cette erreur comme opérationnelle et de
‫créer un message significatif, d'accord ?
‫Mais avant de pouvoir le
‫faire, examinons les deux autres erreurs
‫de Mongoose que nous devrons également marquer comme opérationnelles, d'accord ?
‫Alors, créons une nouvelle tournée,
‫et ce que je vais faire, c'est créer un nom en double.
‫Alors, copions simplement celui-ci ici.
‫Et je pense que toutes les
‫valeurs ici sont correctes, alors essayons cela maintenant.
‫Et en effet, ici, nous obtenons l'erreur que nous connaissons déjà, qui
‫est une erreur de clé
‫en double car nous avons déjà
‫une tournée, ou un document avec le nom de Forest Hiker, d'accord ?
‫Encore une fois, c'est une erreur
‫qui va se produire à un moment donné,
‫et encore une fois,
‫il n'y a pas de message d'erreur très significatif, n'est-ce pas ?
‫Et encore une fois, nous devons changer cela.
‫Ensuite, le troisième concerne également
‫la validation, et faisons-le donc ici dans Update Tour.
‫Alors, disons que nous voulons avoir une note moyenne de six,
‫ce que nous savons être invalide, non ?
‫Parce que nous avons dit que le maximum de notes
‫moyennes pourrait être de cinq.
‫Voyons donc, et
‫en effet, nous obtenons cette ValidationError, n'est-ce pas ?
‫Cela s'appelle donc ValidationError, et
‫il a cet objet d'erreurs avec toutes les erreurs.
‫Mettons-en un autre ici.
‫Alors disons difficulté,
‫et puis autre chose, donc
‫un qui n'est pas facile, moyen ou
‫difficile, et maintenant nous obtenons ces deux objets ici.
‫Un pour les notes et un pour la difficulté, d'accord ?
‫Ce sont donc les
‫trois erreurs que nous allons
‫marquer comme opérationnelles, en commençant par
‫la première, donc en gros, le type CastError, d'accord ?
‫Alors, revenons ici, et nous allons le faire ici,
‫encore une fois, parce que nous ne voulons le faire qu'en production, d'accord ?
‫Dans le développement, nous ne nous soucions pas de tout cela.
‫Tout ce que nous voulons
‫faire, c'est voir nos erreurs afin de pouvoir
‫les corriger, mais en production, c'est là
‫que nous voulons envoyer les messages d'erreur significatifs aux clients.
‫Alors, disons si vous vous trompez. name est égal
‫à CastError, et c'est ainsi que nous allons identifier ce
‫type d'erreur ici dont
‫nous venons de parler, car
‫il porte le nom de CastError, d'accord ?
‫Donc si erreur. le nom
‫est CastError, alors nous allons appeler une fonction spéciale que nous
‫allons créer dans
‫une seconde, qui s'appelle handleCastError.
‫Et puis je vais aussi dire ici DB pour base de données,
‫afin que nous sachions que cela est lié à notre base de données, d'accord ?
‫Et c'est comme ça que ça va fonctionner.
‫Nous allons transmettre l'erreur
‫que Mongoose a créée dans cette
‫fonction, donc juste comme ça, et cela
‫renverra ensuite une nouvelle erreur créée sans la classe AppError, d'accord ?
‫Et cette erreur sera alors marquée comme opérationnelle,
‫car rappelez-vous, toutes nos erreurs d'application
‫ont les propriétés opérationnelles
‫définies automatiquement sur deux, n'est-ce pas ?
‫Cela renverra donc une erreur, et donc, gardons cela, d'accord ?
‫Et ainsi gardaient cela par erreur.
‫Maintenant, ce n'est pas du
‫tout une bonne pratique de remplacer les arguments d'une fonction, d'accord ?
‫L'erreur vient donc de cette fonction d'erreur du milieu, n'est-ce pas ?
‫Donc, à partir d'ici, et au lieu de faire
‫ça, je vais en fait
‫créer une copie papier de cet objet d'erreur, d'accord ?
‫Alors let, et j'utilise let, et non const, car nous
‫allons bien sûr réaffecter
‫une nouvelle erreur ensuite, plus tard ici.
‫Appelons donc cette erreur au lieu de simplement
‫err, qui est le nom normal des erreurs dans Express.
‫Et encore une fois, nous allons
‫utiliser notre astuce où nous utilisons la déstructuration de l'erreur d'origine, d'accord ?
‫Et donc, à partir de maintenant, nous utiliserons cette erreur au lieu de err.
‫Alors ici, et ici, et ici.
‫Bien?
‫Et donc, allons de l'avant
‫et créons réellement cette fonction ici.
‫Mettons donc cela ici dès le début.
‫Bien.
‫Essayez de vous rappeler que cela reçoit
‫une erreur, et maintenant je vais simplement l'appeler err comme ceci, car
‫encore une fois, c'est un peu la norme dans Express.
‫Et pour commencer,
‫examinons à nouveau l'objet d'erreur ici, d'accord ?
‫Donc ici, nous avons le chemin, et nous avons aussi la valeur, d'accord ?
‫Donc, le chemin ici est essentiellement le nom du
‫champ pour lequel les données d'entrée sont au mauvais format, d'accord ?
‫Et cette valeur ici est alors celle-ci, qui
‫est, bien sûr, celle que nous avons passée, d'accord ?
‫Donc, cela peut non seulement se produire pour l'ID, mais
‫vraiment, pour tout champ que nous
‫recherchons avec une valeur dans le mauvais format, d'accord ?
‫Et donc, créons maintenant
‫une chaîne qui dit que nous
‫avons un ID invalide avec la valeur de celui-ci dans ce cas, d'accord ?
‫Donc, c'est le chemin et la valeur, d'accord ?
‫Alors, créons un message ici et disons
‫Invalid err. le chemin est une
‫erreur. valeur.
‫D'accord?
‫Et maintenant, nous renvoyons simplement notre propre AppError.
‫D'accord?
‫Alors comme je l'ai mentionné plusieurs fois maintenant, d'accord ?
‫Donc AppError, et je dois en fait l'inclure ici, ou
‫l'exiger, car je ne l'ai pas encore fait.
‫Donc, const AppError est égal à require, et
‫monte d'un niveau, puis dans le dossier
‫des utilitaires, puis dans appError.
‫C'est ici.
‫Et maintenant, dans ou AppError, nous passons notre message et
‫le code d'état 400, qui signifie Bad Request.
‫D'accord, et juste comme ça, nous
‫transformons l'erreur étrange que nous
‫recevions de Mongoose en
‫une erreur opérationnelle
‫avec un joli message amical qu'un
‫humain
‫réel peut lire, d'accord ?
‫D'accord, une dernière chose que nous
‫devons changer ici est de définir également celle-ci ici sur erreur, d'accord ?
‫Et donc, tout de suite, si notre erreur est CastError,
‫eh bien, on va alors passer l'erreur dans
‫cette fonction qui va retourner notre AppError, donc
‫celle-ci, et c'est celle qui sera ensuite envoyée au client
‫à l'aide de notre sendErrorProd, d'accord?
‫Et donc, essayons maintenant cela.
‫Alors ici, dans notre package. json,
‫nous avons ce script start:prod, alors essayons cela.
‫Donc, npm lance start:prod, et je peux en fait compléter automatiquement ces noms de
‫script npm en utilisant l'onglet ici dans le terminal, d'accord ?
‫Et donc, cela va démarrer
‫un processus en mode production, en gros, d'accord ?
‫Et donc, essayons maintenant à nouveau.
‫Donc, si vous faites maintenant cette
‫demande, nous devrions récupérer le message d'erreur
‫que nous venons de créer, car en ce moment, nous sommes en production.
‫Et en effet, le voici.
‫Nous avons donc invalide, puis le nom du champ, ou
‫en fait le nom du chemin, puis la valeur que
‫nous avons insérée.
‫Donc, si nous essayons quelque
‫chose de différent, alors bien sûr, nous
‫obtenons ceci, et bien sûr, également notre code 400 Bad Request.
‫D'accord génial.
‫Donc, celui-ci est maintenant géré.
‫Dans le prochain cours, nous nous occuperons du suivant, qui concerne
‫les noms de champs en double, d'accord ?
‫Alors, à bientôt dans une seconde.