Le cours Express.js - Module 10 : journalisation et traitement des erreurs | Shivendra Raghuvanshi | Skillshare
Recherche

Vitesse de lecture


1.0x


  • 0.5x
  • 0.75x
  • 1 x (normale)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Le cours Express.js - Module 10 : journalisation et traitement des erreurs

teacher avatar Shivendra Raghuvanshi, Lead Developer and Online Teacher

Regardez ce cours et des milliers d'autres

Bénéficiez d'un accès illimité à tous les cours
Suivez des cours enseignés par des leaders de l'industrie et des professionnels
Explorez divers sujets comme l'illustration, le graphisme, la photographie et bien d'autres

Regardez ce cours et des milliers d'autres

Bénéficiez d'un accès illimité à tous les cours
Suivez des cours enseignés par des leaders de l'industrie et des professionnels
Explorez divers sujets comme l'illustration, le graphisme, la photographie et bien d'autres

Leçons de ce cours

    • 1.

      Introduction du cours

      2:28

    • 2.

      Introduction : enregistrement et traitement des erreurs

      3:23

    • 3.

      Erreur de sélection de serveur

      3:24

    • 4.

      Erreur dans le middleware dans Express

      4:32

    • 5.

      Éliminer les blocages par essais et attrapages

      6:42

    • 6.

      Utiliser le module Errors Express Async

      3:13

    • 7.

      Erreurs de journalisation

    • 8.

      Connexion à MongoDB

      3:46

    • 9.

      Exceptions non attrapées

      5:03

    • 10.

      Refus non gérés

      7:39

    • 11.

      Extraire des routes

      4:40

    • 12.

      Extraire la logique de la capture

      2:08

    • 13.

      Extraire la logique de la base de données

      4:30

    • 14.

      Extraire la logique de configuration

      4:49

  • --
  • Niveau débutant
  • Niveau intermédiaire
  • Niveau avancé
  • Tous niveaux

Généré par la communauté

Le niveau est déterminé par l'opinion majoritaire des apprenants qui ont évalué ce cours. La recommandation de l'enseignant est affichée jusqu'à ce qu'au moins 5 réponses d'apprenants soient collectées.

2

apprenants

--

projet

À propos de ce cours

Le module 10 : journalisation et gestion des erreurs consiste à créer des applications backend fiables et faciles à gérer avec Express.js. Vous apprendrez à identifier, à enregistrer et à gérer efficacement les erreurs, afin de vous assurer que votre application reste robuste et sécurisée en toutes circonstances. Ce module couvre également la compétence essentielle d'organisation de votre base de code en extrayant la logique critique dans des modules séparés et réutilisables.

Ce que vous apprendrez

  • Gérer les erreurs de sélection de serveur avec élégance.
  • Maîtriser l'utilisation des logiciels intermédiaires d'erreur dans Express.js.
  • Simplifier la gestion des erreurs en utilisant Express Async Errors.
  • Enregistrez les erreurs dans la console, les fichiers et même MongoDB pour le suivi et le débogage.
  • Traiter les exceptions non prises et les rejets non gérés.
  • Extraire les routes, la journalisation, la base de données et la logique de configuration dans des composants modulaires pour une base de code plus propre.

Rencontrez votre enseignant·e

Teacher Profile Image

Shivendra Raghuvanshi

Lead Developer and Online Teacher

Enseignant·e
Level: Intermediate

Notes attribuées au cours

Les attentes sont-elles satisfaites ?
    Dépassées !
  • 0%
  • Oui
  • 0%
  • En partie
  • 0%
  • Pas vraiment
  • 0%

Pourquoi s'inscrire à Skillshare ?

Suivez des cours Skillshare Original primés

Chaque cours comprend de courtes leçons et des travaux pratiques

Votre abonnement soutient les enseignants Skillshare

Apprenez, où que vous soyez

Suivez des cours où que vous soyez avec l'application Skillshare. Suivez-les en streaming ou téléchargez-les pour les regarder dans l'avion, dans le métro ou tout autre endroit où vous aimez apprendre.

Transcription

1. Introduction du cours: Bienvenue dans le module 10, consacré à journalisation et à la gestion des erreurs de la série de cours Express JS. Je m'appelle Shawn Ragawnhi, votre guide pour Au fil des ans, j'ai développé applications évolutives et robustes pour divers secteurs. Dans ce cours, je vous aiderai à aborder l'un des aspects les plus critiques du développement, de la journalisation et de la gestion des erreurs en backend journalisation et de la gestion des erreurs L'un de mes moments les plus fiers a été celui où j'ai conçu un système de journalisation qui a réduit le temps de débogage d' un client de 60 % Aujourd'hui, je vais vous montrer comment obtenir des résultats similaires. Dans ce module, nous nous concentrerons sur identification et la gestion efficaces des erreurs dans Express s, en simplifiant la gestion des erreurs avec des outils tels que les erreurs asynchrones d'Express, enregistrant les erreurs vers plusieurs destinations telles que les fichiers et MongoDB pour Ensuite, gérer les exceptions non détectées et les rejets non gérés pour garantir la stabilité de l'application Enfin, nous allons extraire et organiser les éléments clés de votre application enregistrement et la configuration des itinéraires , pour une base de code propre et maintenable Ce cours s'adresse aux développeurs qui souhaitent créer des Express Jas robustes et faciles Si vous avez terminé les modules précédents, vous êtes prêt à vous lancer. Des connaissances de base de JavaScript , de Jas et d'Express sont tout ce dont vous avez besoin pour commencer. En maîtrisant la gestion des erreurs et la journalisation, vous améliorerez considérablement la fiabilité de vos applications Vous économiserez également d'innombrables heures de débogage, ce qui fera de vous un développeur plus efficace et plus utile Enfin, pour le projet, vous allez créer un gestionnaire personnalisé pour gérer les journaux lors de plusieurs transports. Il s'agit de Console Files et de Manga DB. Ensuite, vous allez refactoriser l' application Fair Wheels en extrayant validation Joy et la logique du serveur dans des modules distincts Ces tâches pratiques consolideront votre compréhension de la gestion des erreurs et de la modularisation Ce module change la donne en vos compétences en matière de développement de backend Plongeons-nous dans le vif du sujet et rendons vos applications plus robustes que jamais. Rendez-vous à la première conférence, commençons. 2. Introduction : enregistrement et traitement des erreurs: Dans notre mise en œuvre actuelle de l'application Fairwee, nous avons opté pour un monde idéal où tout fonctionne correctement Cependant, dans le monde réel, il y a toujours des erreurs inattendues. Par exemple, il est possible que notre connexion à Mongo Deb soit interrompue pour une raison quelconque Il est donc recommandé tenir compte de ces situations inattendues et de les gérer correctement, ce qui signifie que vous devez envoyer un message d'erreur approprié au client et consigner l' exception sur le serveur. Plus tard, vous pourrez consulter le journal et voir quels sont les problèmes qui se produisent fréquemment et comment vous pouvez les améliorer. Permettez-moi donc de vous présenter un scénario réel dans lequel notre serveur Mongo EV meurt. Donc, ici dans le terminal, vous pouvez voir que je lance l' application avec le mod Nord. Et voici l'autre fenêtre de mon terminal où je lance Mongo Damon Il s'agit d'un service d'arrière-plan qui écoute sur le port 27017 Et ici, dans Postman, j'ai un onglet ouvert pour envoyer une demande d'API CR Ainsi, lorsque nous envoyons cette demande, nous recevons 200 réponses. Magnifique. Maintenant, de retour dans le terminal Mongo DB, je vais arrêter ce processus Permettez-moi donc d'ouvrir une nouvelle fenêtre Power Show et de taper le nom du meilleur service MongoDB. Et c'est tout. Notre serveur Mongo DV est maintenant arrêté. Voyons ce qui se passe lorsque vous envoyez cette demande une fois de plus. Donc c'est accroché. Après quelques secondes, nous allons voir un message d'erreur dans le terminal sur lequel nous exécutons l'application. OK, voici le message d'erreur. Erreur de sélection du serveur Mongo, de sélection du SRO, puis nous avons une sélection de serveur à valeurs dynamiques, délai S. Et voici l'erreur réelle interrompue à l'arrêt Ainsi, par défaut, lorsque vous vous connectez à Mongo DB, si la connexion ne peut pas être établie, pilote MongoDB tentera de se reconnecter trois fois avec un intervalle d'une seconde. Si vous faites défiler la page vers le bas, C, notre application s'est bloquée. Cela signifie que nous avons quitté le processus avec le code 1. Maintenant, dans cette démonstration en particulier, j'ai arrêté le serveur MongoIV, donc peu importe que ce processus soit actif ou non . Mais imaginons que dans un scénario réel, notre serveur Manga Divi soit en panne pendant, disons, 1 minute, puis qu'il revienne au bout d'une minute Avec la mise en œuvre actuelle, notre processus de nœud prendra fin et ne pourra servir aucun autre client même après le retour de Mongo Divi Il s'agit donc d'un problème très important. Nous devons donc gérer correctement ces scénarios, et c'est ce que nous allons apprendre dans cette section. 3. Erreur de sélection de serveur: Faisons maintenant le premier pas pour gérer correctement cette erreur. Ainsi, chaque fois que vous voyez une erreur de sélection de serveur, cela signifie que le client Manga B ne peut se connecter à aucun serveur du déploiement de Mangaib Cela se produit pour diverses raisons, telles que des sonneries de connexion incorrectes, des problèmes de réseau, une mauvaise configuration du serveur ou une incompatibilité de version Notez que cette erreur s'est produite lorsque nous avons essayé de récupérer des données depuis l'API de la voiture Passons donc à notre module sur les voitures. C'est le gestionnaire pour obtenir la liste des voitures. Nous avons donc ici une promesse qui est retournée ici. Nous attendons cela, mais nulle part dans ce code, nous n'avons un bloc de cache d'essai pour gérer les promesses rejetées. Cette implémentation revient à obtenir une promesse, à l' appeler, mais à ne pas appeler de l' argent pour gérer les erreurs. Donc, si vous utilisez la syntaxe promise, nous devons toujours appeler le cache pour gérer les exceptions. Si vous utilisez une synchronisation et Aviate, vous devriez toujours avoir des blocs de cache r. Ici, nous devons mettre ce code dans un bloc tri comme celui-ci , puis ajouter le bloc de cache où se trouve l'erreur. Maintenant, nous devons envoyer une réponse appropriée au client. Répondez donc à ce statut. Nous utilisons le code d'erreur 500, qui signifie une erreur interne du serveur. Donc, quelque chose a échoué sur le serveur, nous ne savons pas quoi. Et puis envoyez un message comme si quelque chose avait échoué. Techniquement, nous devrions également enregistrer l'exception ici, mais nous y reviendrons plus tard. Améliorons donc cette application étape par étape. Voyons maintenant comment fonctionne cette nouvelle implémentation. Donc, de retour dans le terminal, je vais d' abord démarrer Mangaibi car si nous ne le démarrons pas et ne lançons pas l'application, écoutez, nous ne pouvons pas nous connecter à Donc, au départ, je veux être connecté à Mangaib, puis je veux supprimer cette connexion quelque part entre les deux Arrêtons donc cette application. Revenons maintenant à la fenêtre du terminal. Exécutons le nom du service de démarrage Mangaib. Lancez maintenant notre application Fair Wheels. OK, connecté à Manga DV. Je vais commencer ce processus. Encore une fois, le meilleur nom de service Manga DV. Ensuite, ici dans Post MD, je vais envoyer une demande pour le point de terminaison de la voiture. Cela va prendre 30 secondes, je vais donc suspendre l' enregistrement et revenir. D'accord. C'est ce que nous obtenons. 500 erreurs internes au serveur. Et c'est notre message. Maintenant, si vous regardez la fenêtre du terminal de notre application, vous ne voyez plus cette erreur de sélection du serveur, qui a entraîné la fin de ce processus. 4. Erreur dans le middleware dans Express: Lors de la dernière conférence, nous avons donc fait le premier pas pour gérer correctement les erreurs. Mais il y a un problème dans la mise en œuvre actuelle. Imaginons que demain nous décidions de modifier le message que nous envoyons au client. Avec l'implémentation actuelle, nous devons passer en revue tous les gestionnaires de route dans lesquels nous utilisons ce bloc Trcche et modifier Donc, dans une situation réelle, nous allons enregistrer ici l'erreur. Encore une fois, si à l'avenir, nous décidons de modifier la façon dont nous enregistrons l'erreur devrons revenir à plusieurs gestionnaires de routes et apporter cette modification Nous voulons donc déplacer cette logique gestion des erreurs vers un endroit central. À l'avenir, nous voulons donc modifier la logique de gestion des erreurs. Il y a un seul endroit que nous devons modifier. Passons donc au point d'index g. C'est ici que nous enregistrons nos fonctions intergicielles Dans Express, nous avons un type spécial de fonction d' intergiciel appelé intergiciel d'erreur Nous enregistrons cette fonction intergicielle après toutes les fonctions intergicielles existantes Ici, nous appelons l'application américaine et lui transmettons une fonction middleware avec trois paramètres, réponse à la demande et la suivante Mais nous ajoutons également un quatrième argument ici au début. C'est l'exception ou l'erreur que nous détectons ailleurs dans l'application. Maintenant, dans cette fonction, nous ajoutons toute la logique de gestion des erreurs dans notre application. Revenons donc aux voitures Js. Je vais couper cette logique à partir d'ici et la coller ici. Maintenant, revenons aux voitures J. une fois de plus. Ici, dans ce bloc de cache, nous voulons passer le contrôle à notre fonction middleware de gestion des erreurs Nous ajoutons donc un nouveau paramètre ici, ensuite. Et comme vous le savez, nous appelons next to pass control la fonction middleware suivante dans le pipeline de traitement des demandes Ici, dans le bloc de cache, nous appelons next et passons cette erreur en argument. Maintenant, comme dans index ou Js, nous avons enregistré cette fonction après toutes les fonctions intergicielles existantes, lorsque nous appellerons next, nous nous retrouverons Et l'erreur que nous transmettrons sera le premier argument de cette fonction. Avec cette nouvelle implémentation, nous disposons désormais d'un seul endroit pour gérer les erreurs. Donc, si vous souhaitez apporter des modifications à l'avenir, nous ne ferons que modifier cette fonction. Dans une application du monde réel, la logique de journalisation de l'exception ou des erreurs peut être longue de plusieurs lignes. Nous ne voulons pas ajouter tous les détails dans le point d'index Js. Donc, dans index ou Js, nous voulons simplement faire de l'orchestration Nous voulons conclure un accord de haut niveau. Les détails doivent être encapsulés dans un autre module. Je vais donc déplacer cette fonction, cette fonction middleware vers un module séparé Donc, de retour ici, nous avons ce dossier intergiciel. Ajoutons un nouveau fichier ici, point d'erreur Js. Pour en revenir à l'index Js, je vais obtenir cette fonction ici et, par erreur Js, définir les exportations de modules sur cette fonction. Nous avons donc séparé les détails de la gestion des erreurs dans un module distinct, ce qui permet de mieux séparer les préoccupations. En index ou en Js en haut, nous devons charger ce module. Donc erreur const. Nous avons défini ce paramètre sur require. Ensuite, nous montons d'un niveau dans le dossier du middleware et déchargeons le Enfin, ici, nous appelons app point g et lui transmettons notre fonction de gestion des erreurs. Notez que je n' appelle pas cette fonction. Je ne fais que transmettre une référence à cette fonction. Notre application a donc maintenant un meilleur design. Cependant, dans cast ou Js, nous avons ce bloc de cache try, et comme vous pouvez le constater, nous devons répéter dans chaque gestionnaire de route de notre application Nous devons ajouter cette erreur de cache, et ici nous devons appeler next. C'est répétitif. Dans la prochaine conférence, je vais donc vous montrer comment améliorer cette implémentation. 5. Éliminer les blocages par essais et attrapages: Dans ce gestionnaire de route, nous avons un bloc de cache try pour gérer les erreurs Le problème est que nous finirons par répéter ce bloc de cache try dans chaque gestionnaire de route Cela ajoute beaucoup de bruit à notre code et rend plus difficile de se concentrer sur la logique réelle de chaque itinéraire. C'est juste distrayant. Idéalement, nous voulons déplacer cette logique de gestion des erreurs de haut niveau vers une fonction unique que nous pouvons réutiliser sur toutes les routes. Laissez-moi vous montrer comment nous pouvons le faire. Tout d'abord, nous allons créer une fonction réutilisable appelée intergiciel asynchrone Cette fonction servira de modèle. Il inclura le bloc de cache tri dont nous avons besoin, mais nous le rendrons flexible afin qu'il puisse s'adapter aux différents gestionnaires d'itinéraires La fonction prendra donc un gestionnaire de route comme argument comme celui-ci À l'intérieur du bloc tr, nous appellerons ce gestionnaire En cas de problème, le bloc de cache transmettra la fonction d'erreur suivante du middleware Ainsi, la seule partie qui change pour chaque route est une logique spécifique dans le gestionnaire Tout le reste reste pareil. Bien, définissons ce middleware asynchrone. Cette fonction ressemblera donc à ceci. Il prend un gestionnaire de route comme argument à l'intérieur, nous enveloppons le gestionnaire dans un bloc de cache tr Si le gestionnaire génère une erreur, le bloc de cache appelle next avec l'exception Utilisons maintenant ce middleware dans notre itinéraire. Ainsi, au lieu d'écrire ce bloc de cache tr directement dans le gestionnaire de route, nous passons cette fonction à un intergiciel asynchrone Ce middleware se chargera de la gestion des erreurs pour Nous n'avons donc pas besoin du paramètre suivant, du bloc tr et du bloc de cache. Notre code de route devient donc beaucoup plus propre. Maintenant, regardez cette fonction ASN, la fonction anonyme que nous transmettons en tant que gestionnaire de route Finalement, nous voulons transmettre cette fonction ASN comme argument à cette nouvelle fonction Maintenant, comme le gestionnaire est une fonction ASN, nous devons l'attendre Et comme nous avons utilisé await ici, nous devons également marquer cette fonction comme AS. Il y a maintenant un petit problème que nous devons résoudre. Lorsque vous appelez le gestionnaire dans Async Middleware, nous devons transmettre la réponse à la demande et les paramètres suivants nous devons transmettre la réponse à la demande et les paramètres suivants. Mais voici le hic. Ces objets ne sont définis nulle part dans un intergiciel de synchronisation Alors, comment accéder à ces paramètres ? Eh bien, pour résoudre ce problème, nous devons comprendre comment fonctionne Express. Donc ici, lorsque nous définissons une route router dot get, disons nouvelle route. Ici, nous passons une fonction de gestionnaire de route qui prend trois paramètres, réponse à la demande et ensuite, et elle passe à un diagramme de code Nous n'appelons donc pas cette fonction notre service de vente. Au lieu de cela, nous passons une référence à cette fonction, et Express se charge de l' appeler et de transmettre les arguments requis. Il s'agit de la réponse à la demande et de la suivante au moment de l'exécution. Mais dans notre implémentation actuelle, nous appelons directement Async Middleware Ce n'est pas ainsi qu'Express s'attend à ce que cela fonctionne. Nous devons apporter un petit changement ici. Nous allons donc transformer cette fonction d'intergiciel asynchrone en fonction d'usine Donc, au lieu de l'appeler directement, nous allons lui faire renvoyer une nouvelle fonction. Cette fonction renvoyée agira comme le véritable gestionnaire de route qu'Express peut appeler Cette nouvelle fonction renvoyée acceptera donc la réponse à la demande, et ensuite en tant que paramètres. Et à l'intérieur, il appellera le gestionnaire d'origine, que nous passerons au Middleware asynchrone, transmettant la réponse à la demande et ensuite Désormais, lorsqu'Express appelle cette fonction renvoyée, elle fournit les objets nécessaires. C'est la réponse à la demande et ensuite, et tout fonctionnera parfaitement. Lors de l'installation, nous avons déplacé le tricchblock dans un intergiciel asynchrone Cela signifie que nos gestionnaires d'itinéraires sont désormais très propres. Nous attendons l' appel au gestionnaire, nous devons donc marquer la fonction d'appel, qui est cette fonction, comme asynchrone Et nous n'avons plus besoin d'appliquer cette fonction asynchrone ici , car dans cette fonction du middleware asynchrone n' attendons aucune promesse, nous renvoyons simplement une nous renvoyons simplement OK ? Enfin, rendons le middleware asynchrone Nous allons donc le déplacer vers un module distinct ici dans notre dossier middleware Créons un nouveau fichier appelé async Js. Permettez-moi de couper le code pour Async Middleware à partir d' ici et de le coller ici Enfin, nous allons l'exporter sous forme de module thought exports, et nous l'avons défini sur fun engine. De retour ici dans Casta Js, il suffit de charger ce middware asynchrone. Donc, en haut, const async middleware. Nous l'avons configuré pour requérir ensuite le dossier middleware et async Et c'est tout. Vous pouvez désormais utiliser ce middleware dans n'importe quel gestionnaire de route de votre application. Ainsi, avec cette approche, votre cœur devient plus propre, plus concentré et plus facile à entretenir. 6. Utiliser le module Errors Express Async: Dans la dernière conférence, nous avons défini cette fonction d' intergiciel asynchrone Maintenant que cette fonction d' intergiciel asynchrone résout le problème des blocs tr cach répétitifs, le problème que nous avons est que nous devons nous rappeler de l'appeler à Et cela rend également notre cordon un peu bruyant. Dans cette conférence, je vais donc vous montrer une approche différente. Nous allons utiliser un module NPM, et ce module patchera uniquement nos gestionnaires de routes lors Ainsi, lorsque nous envoyons une demande à ce point de terminaison, ce module encapsule le code de notre gestionnaire de route dans quelque chose comme ça Laissez-moi vous montrer comment cela fonctionne. Ouvrez donc un terminal et installez Express, async errors. Installons-le. Passons maintenant à index ou Js. Nous devons charger ce module au démarrage de l'application. Nous aurons donc besoin d' erreurs asynchrones express. C'est tout ce que nous devons faire. Vous n'avez pas besoin d'obtenir le résultat et de le stocker dans une constante. Maintenant, de retour dans Cars ou JS, nous pouvons supprimer l'appel à Async Middleware et revenir à l'implémentation initiale de notre gestionnaire de route, qui est beaucoup De même, je vais supprimer le deuxième appel au middleware Async Enfin, en haut de la page, je vais également supprimer l'instruction requise. Maintenant, testons cela et vérifions-nous qu'il fonctionne correctement. De retour dans le terminal, je vais lancer notre application Fairwheels Maintenant, dans les facteurs, je vais chercher toutes les voitures. Ce point de terminaison fonctionne donc. Maintenant, je vais arrêter Manga DB. Donc, ici, dans le terminal Manga Di B, arrêtons cela avec le nom de service principal Manga DB , puis envoyons une autre demande au serveur pour qu'il l'envoie à nouveau. Cela va prendre un petit moment. Très bien, voici la réponse à laquelle nous nous attendions : une erreur 500 avec ce message. Cela vérifie donc que ce module que nous avons installé a correctement déplacé le contrôle d'un gestionnaire de route vers notre fonction de gestion des erreurs Vous pouvez donc voir que l'utilisation erreurs Express Async est très, très simple Et c'est l' approche que je suggère pour gérer les erreurs asynchrones dans les gestionnaires de route express Toutefois, si ce module ne fonctionne pas pour votre application pour une raison quelconque, vous devez revenir à cette autre approche et utiliser la fonction de middleware asynchrone 7. Erreurs de journalisation: Il s'agit de notre intergiciel d'erreur. Maintenant, comme je vous l'ai déjà dit, dans chaque application d'entreprise, nous devons enregistrer les exceptions émises dans l'application. Plus tard, nous revenons, examinons le journal et voyons quels sont les domaines de l'application que nous pouvons améliorer. Dans cette conférence, je vais donc vous présenter une bibliothèque de journalisation très populaire appelée Winston Voici donc le Winston sur NPM. La version actuelle est 3.17. Et comme vous pouvez le constater, il y a eu plus de 13 millions de téléchargements hebdomadaires. C'est une bibliothèque très populaire et riche en fonctionnalités. Commençons donc. Ici, dans le terminal, NPM installe Winston Magnifique. Revenons maintenant à la page NPM Ici, vous pouvez voir que la méthode recommandée pour utiliser Winston est de créer votre propre enregistreur Et ci-dessous, nous avons un exemple de code pour commencer. Je vais donc simplement copier ce code et le modifier en fonction de notre application. Copiez tout cela et collez-le ici dans arrodt Js. En haut, nous avons notre module Winston. Ensuite, nous avons notre enregistreur, qui est créé à l'aide de cette méthode de création d'enregistreur Il contient un objet avec peu de propriétés, de niveau, de format, de méta par défaut et de transports. Permettez-moi donc de vous expliquer comment cela fonctionne. Tout d'abord, nous avons le niveau de journalisation. Le niveau contrôle donc quels journaux doivent être traités. Cela signifie qu'il filtre les journaux par gravité. La gravité de tous les niveaux est donc supposée être numériquement croissante du plus important au moins important Cela signifie que si nous avons une erreur, elle a une gravité de zéro et elle a la priorité la plus élevée. De même, nous en avons un, info, STDP et verbs debug et silly avec une sévérité de six, et il a Ici, nous avons défini le niveau par défaut sur info, ce qui signifie que tous les messages d'information, avertissement et d'erreur seront retardés Et si nous définissons le niveau sur les verbos, tous les messages des verbes et des niveaux supérieurs seront verrouillés Ensuite, nous avons le format. Un format est donc utilisé pour personnaliser l'affichage des journaux. Il s'agit d'un texte brut, d'un objet JCN ou d'un horodatage Et il existe d'autres formats, ceux-ci sont implémentés sous forme de journal, un module distinct de Winston, et vous pouvez consulter ce module pour voir tous les formats disponibles Ici, nous allons utiliser le JCNFMat et nous n'avons pas besoin de cette Maintenant, cet objet enregistreur possède un tableau de transports. Un transport est donc essentiellement un support de stockage pour nos journaux. Il définit donc où les journaux sont envoyés. Winston est livré avec quelques moyens de transport de base. Il s'agit de la console pour enregistrer les messages sur la pile de console et protocole HTTP pour appeler un point de terminaison SDDB pour la journalisation des Il existe également des plugins pour Winston. Il existe d'autres modules NPM pour la journalisation des messages dans Mongo DB et COS DB, une autre base de données non SQL populaire Il existe également un plugin pour enregistrer les messages dans Redis et Loge, qui est un service d'analyse et de surveillance des journaux très populaire pour les applications d'entreprise Nous allons maintenant utiliser deux transports différents, l'un pour enregistrer les messages dans un fichier et l'autre pour les connecter à la console. Permettez-moi donc de changer celui-ci en console. Et nous n'avons pas besoin de cette propriété de nom de fichier ici. Notre enregistreur est prêt à être utilisé, et si vous souhaitez simplement avoir un fichier de journaux au format JSON, cette quantité de code est suffisante pour le faire Cependant, Winston ne se limite pas à cela. Il est également possible de définir un format personnalisé et un niveau personnalisé pour chaque transport séparément. Et n'importe quel nombre de formats peuvent être combinés en un seul format à l'aide de la combinaison de points de format. Je vais donc utiliser quelques formats dans nos transports, puis les combiner pour une meilleure expérience. Laissez-moi vous montrer comment procéder. Tout d'abord, supprimons ce niveau et ce format par défaut. Maintenant, sur la console, je souhaite utiliser des couleurs pour enregistrer les niveaux en fonction du mappage personnalisé. Pour cela, nous pouvons utiliser format coloriser et le combiner avec un format simple Ici, ajoutez un format de propriété, puis nous appelons la méthode combinée, la combinaison de points au format Winston Dot et transmettons simplement les formats que nous voulons combiner Donc Winston Dot Format Dot Dot Dot Dot Dot Dot Dot Dot Simple Nous voulons également lui donner des informations sur le niveau. Donc, comme je l'ai déjà mentionné, tous les messages d'info one et de niveau d'erreur seront enregistrés sur la console. C'est ça. De même, nous pouvons personnaliser notre transport de fichiers. Comme vous pouvez le constater, le niveau personnalisé est déjà défini sur erreur. Génial. Ici, nous voulons rendre les journaux plus lisibles en ajoutant la date et l'heure actuelles. Cela peut être fait en combinant les formats horodatage et JCN. Alors, encore une fois, j'appelle Combine. Et puis passez wstin point forma dot Time STAMP et instin point fam point JCN Ce faisant, nous avons ajouté un horodatage à chaque erreur susceptible de se produire dans l'objet JSN Enfin, nous devons utiliser cet enregistreur dans notre intergiciel d'erreurs Nous appelons donc logger point log. Ensuite, nous passons un objet avec un niveau de propriété, que nous pouvons définir sur error ou vous pouvez simplement utiliser la méthode d'assistance aux erreurs pour enregistrer directement l'erreur. Comme ça. Il ne nous reste plus qu'à transmettre le message d'erreur. Nous avons donc défini la propriété du message sur err point message. Maintenant, pour le démontrer, passons à cars dot js. Ici, dans l'itinéraire Get Cars, je vais générer une erreur. Alors lancez une nouvelle erreur, impossible de récupérer les voitures. Imaginons donc que quelque part dans l'application, une erreur soit générée avec l'implémentation actuelle. Notre intergiciel d'erreur détectera cette exception. Il l'enregistrera à l'aide de Winston et renverra l' erreur 500 au lien Alors testons cela. Je vais lancer l'application, Norman Beautiful. Maintenant, de retour dans Postman, envoyons une requête get au point de terminaison de la voiture D'accord. Voici donc notre erreur interne de serveur. Maintenant, si vous regardez la console, nous avons une erreur car nous avons utilisé la méthode d'erreur par points de Winston, et sa couleur est rouge Et voici le message d'erreur que nous avons envoyé, nous pas pu récupérer les voitures Il s'agit donc du transport par console que nous avons personnalisé sur l'enregistreur Maintenant, dans notre projet, vous pouvez voir ici que nous avons ce nouveau fichier, le journal des points d'erreur. Nous avons ici un objet JSON avec quelques niveaux de propriétés, dont le message d'erreur ne peut pas récupérer les voitures et l'horodatage Ainsi, à l'avenir, vous pourrez interroger le fichier journal et peut-être extraire uniquement les erreurs à une date précise. C'est donc une vue d'ensemble. Nous appelons simplement logger point error ou l'une des méthodes auxiliaires. Et en fonction du transport que nous avons configuré, Winston enregistrera le message donné Dans la prochaine conférence, je vais vous montrer comment vous connecter à Mongo DB 8. Connexion à MongoDB: C'est bon. Maintenant, laissez-moi vous montrer comment enregistrer des messages sur Manga Deb. La connexion à Mangaib est rendue assez simple avec un autre package NPM, assez simple avec un autre package NPM, Winston Mangaib. Alors, installons-le. Installez Winston Mangaib par NPM. La version 6.0 0.0. Assurez-vous donc d'avoir exactement la même version. Sinon, ce que je vais vous montrer ne fonctionnera pas dans votre système. Retour dans E Js Lors de la dernière conférence, nous avons ajouté des transports personnalisés de fichiers et de consoles. Nous allons maintenant ajouter un nouveau transport Manga Divi. Tout d'abord, nous devons aller au sommet. Après avoir chargé Winston, nous devons charger Winston Manga DB require Winston Manga require Winston Et ici, nous ne nous soucions pas de ce qui est exporté depuis ce module. Nous avons juste besoin de l'exiger. D'accord, nous pouvons venir ici et appeler logger point at new Winston Dot at new Winston Dot transporte Manga B. Nous transmettons un objet d'options Vous trouverez ici quelques propriétés que vous pouvez consulter dans la documentation. Celui que vous devez définir est DB. Nous l'avons donc définie sur la chaîne de connexion de notre base de données, Manga DB holland 127.0 0.0 0.142 7017 fair wheels Maintenant, dans un scénario réel, vous souhaiterez peut-être séparer votre journal de votre base de données opérationnelle. C'est une décision qui varie d'un environnement à l'autre. Ici, nous allons utiliser la même base de données pour enregistrer nos erreurs. C'est bon, on en a fini avec ça. Maintenant, nous n'avons pas besoin d' apporter d'autres modifications. Donc, la prochaine fois qu'il y aura une erreur dans l'application parce que nous avons un autre transport, Winston enregistrera automatiquement notre erreur dans Mongadib Lancez donc à nouveau l' application. Et de retour dans Postman, envoyez une demande au terminal de la voiture Jetons maintenant un coup d'œil à MongoAV Compass. Voici donc notre base de données Fairwheel. Rafraîchissons-le. Nous pouvons voir que nous avons un nouveau journal de collecte, et c'est le message qui nous manquait. Voici donc l'horodatage. Le niveau est défini sur erreur. Et voici le message, impossible d'aller chercher des voitures. Dans la dernière conférence, j'ai parlé de la définition d'un niveau personnalisé pour chaque transport séparément. Alors ici, vous voulez peut-être uniquement verrouiller les erreurs dans Mongoib Vous ne souhaitez pas stocker de messages d'information ni de messages de débogage Si tel est le cas, dans l'objet options, vous définissez également la propriété level sur error. Ainsi, seuls les messages d'erreur seront enregistrés. Maintenant, comme nous l'avons indiqué précédemment, si vous dites cela à info, étant donné que le niveau d'information a une priorité de deux et se situe au troisième niveau de journalisation, seuls l'avertissement d'erreur et les messages d'information seront enregistrés. Rien d'autre que des informations ne sera enregistré dans Manga Divi. 9. Exceptions non attrapées: Désormais, cet intergiciel d'erreur que nous avons ajouté ici ne détecte que les erreurs qui se produisent dans le cadre du pipeline de traitement des demandes Cela est donc propre à Express. Si une erreur est générée en dehors du contexte d'Express, ce middleware ne sera pas utilisé Laisse-moi te montrer. Au bas de ce fichier, après l'exportation, je vais lancer une nouvelle erreur. Alors lancez une nouvelle erreur, quelque chose a échoué au démarrage. Cette erreur est donc renvoyée en dehors du contexte du traitement d'une demande. Cela ne fait pas partie du contexte d'Express. Alors maintenant, lorsque j' exécuterai cette application, vous verrez que cette erreur bloquera le processus et que Winston ne pourra pas l' enregistrer dans le journal Pour vérifier cela, laissez-moi accéder à notre fichier journal, supprimer tout ici, enregistrer maintenant dans le terminal. Lancez notre application. Norman, d'accord, vous pouvez donc voir que notre application s'est écrasée, et voici notre erreur. Quelque chose a échoué au démarrage. Et si vous regardez le fichier journal, vous pouvez voir qu'il n' y a rien ici. Ainsi, si vous déployez cette application en production, ne fonctionnera pas et vous n'aurez aucun moyen de savoir ce qui s'est passé si vous n'avez accès à la console sur le serveur. C'est là qu'intervient Winston. Il vous permet de détecter et d' enregistrer les exceptions non supprimées sans effort Dans cette conférence, je vais donc vous montrer comment gérer correctement les exceptions non détectées dans un processus à nœuds C'est à un niveau supérieur. Ce n'est pas lié à l'expression. Maintenant, de retour dans EOD ou Js, ici, lors de la création de votre enregistreur, ajoutez la propriété d'un gestionnaire d'exceptions et transmettez-lui un tableau contenant une instance de transport Donc des gestionnaires d'exceptions. Nous l'avons défini sur un tableau où nous transmettons une instance de transport, nouveau Winston point transporte un fichier de points Il prend un objet avec un nom de fichier de propriétés. Et ici, nous voulons enregistrer les exceptions non coupées dans un fichier séparé Permettez-moi donc d'appeler cela un journal des points d'exceptions. Et c'est tout. Facile, non ? Et si vous avez déjà configuré un enregistreur et que vous souhaitez activer la gestion des exceptions ultérieurement ? Cela ne pose aucun problème. Vous pouvez utiliser la méthode de gestion des points des exceptions. Laisse-moi te montrer. Je vais donc le recommander et ci-dessous, après avoir défini notre enregistreur, nous appelons logger point exceptions point handle et transmettons l'instance de transport comme nous le faisions Donc, le nouveau fichier à points de transport. Exceptions relatives au nom de fichier, décalage par points. Cette approche est désormais idéale pour apporter de la flexibilité à mesure que votre application évolue. Enfin, nous ne voulons pas que notre application plante après avoir enregistré l'exception non coupée Par défaut, Winston quitte le processus après avoir enregistré une exception non détectée Vous pouvez désactiver ce comportement en définissant la propriété exit on error sur falls lors de la création de votre enregistreur Ici, après les gestionnaires d' exceptions, nous définissons exit en cas d'erreur sur falls, ou vous pouvez l'attribuer dynamiquement comme ceci Le point du logger en cas d'erreur est faux. Et permettez-moi de commenter celui-ci. Maintenant, de retour dans le terminal, exécutons-le encore une fois. Notez que cette fois, le processus ne s'est pas arrêté car nous avons détecté l'exception ici. Le processus s'arrête donc si vous ne détectez aucune exception OK ? Jetons maintenant un coup d'œil à notre fichier journal des exceptions. Vous pouvez voir notre message d'erreur, quelque chose a échoué au démarrage. Avec Winston, vous pouvez facilement gérer les exceptions non supprimées et contrôler le comportement de nos applications inattendues Dans la prochaine conférence, nous examinerons les rejets de promesses non gérés 10. Refus non gérés: Lors de la dernière conférence, nous avons parlé de la gestion des exceptions non détectées Ainsi, s'il existe une exception dans votre application et que vous ne l' avez pas détectée à l'aide d'un bloc de cache, vous pouvez utiliser cette propriété de gestionnaire d'exceptions de l'enregistreur pour l'enregistrer dans un fichier à l'aide Tout comme pour les exceptions non détectées, Winston facilite la mise en cache et l'enregistrement des rejets non gérés Avec la configuration actuelle, un rejet non géré sera également enregistré dans notre fichier journal des exceptions sans faire planter l'application Laisse-moi te le montrer. Donc, ici, dans error point Js, nous lançons une exception. Remplaçons cela par une promesse rejetée. C'est une promesse si constante. Nous avons défini ce paramètre pour promettre un point, rejeter et transmettre un objet d'erreur avec un message, promesse rejetée. Imaginez donc que ce processus représente le résultat d'une opération asynchrone telle un appel à une base de données ou à un service TDP distant, Nous avons donc une promesse rejetée. Et comme je vous l'ai déjà dit, pour les promesses, soit nous les appelons, puis nous devons appeler catch pour nous assurer de gérer les rejets, soit si nous utilisons la syntaxe Async et await, nous attendons la promesse, mais nous devrions la mettre dans un block de cache try pour détecter les exceptions ou les Dans ce code, nous avons une promesse, et je vais appeler puis passer une simple console de rappel point log D. Mais je ne vais pas appeler le cache Nous aurons donc un rejet non traité. Maintenant, si vous lancez l'application Nomon, notre application fonctionne correctement. Et si vous consultez le fichier journal des exceptions, voici notre promesse de rejet non traitée rejetée Winston l'a donc automatiquement détectée comme une exception non détectée et l'a enregistrée sur exceptions point log IL. Cependant, avec Winston, vous disposez un gestionnaire de rejet de propriété pour gérer séparément les pour gérer Laissez-moi vous montrer comment faire. Ici, vous pouvez activer la gestion des rejets lors de la création de votre enregistreur Ainsi, tout comme nous ajoutons des gestionnaires d' exceptions, nous pouvons ajouter des gestionnaires de rejet et leur transmettre une gamme d'encens pour le transport Donc, les gestionnaires de rejet, définissez-le sur un tableau. Ensuite, nous passons devant une nouvelle pile de points Winston Dot Transports. Il prend un objet avec un nom de fichier. Maintenant, je veux enregistrer les refus séparément. Je vais donc l'appeler rejections point log, et c'est tout Cette configuration écrit un fichier journal à points dédié à tous vos rejets non gérés points dédié à tous vos rejets Et si vous avez déjà configuré votre enregistreur et que vous souhaitez gérer les rejets de promesses ultérieurement ? Tout comme la gestion des exceptions, Winston fournit la méthode de gestion des rejets. Permettez-moi donc de le commenter ci-dessous. Juste après avoir appelé logger point exceptions, nous appelons logger point rejections point handle et transmettons simplement à une instance de transport new Winston point ransport point filename file filename reactions point lag Cette approche vous permet d'ajouter un transport spécifique pour les rejets, même après l'initialisation de votre enregistreur Testons-le donc à nouveau dans le point JS d'index du nœud terminal. C'est bon. Regardez cet avertissement, un rejet non traité. Et voici notre erreur. Maintenant, si vous regardez le journal, nous avons un nouveau journal à points des rejets de fichiers Écoutez, voici notre rejet non géré de la promesse, et cette fois, il n'est pas enregistré dans le fichier journal des exceptions Maintenant, avec la version actuelle de node, ce rejet de promesse non géré devrait mettre fin au processus de nœud Mais comme vous pouvez le constater, ce processus est toujours en cours. Nous sommes connectés à Mongo DB. Cela s'est produit à cause de la propriété exit en cas d'erreur dans notre enregistreur, que nous avons définie sur falls Ainsi, qu'il s'agisse d'une exception non détectée ou d'une réaction non gérée, il est recommandé mettre fin au processus du nœud Vous devez donc sortir d'ici, car à ce stade, votre processus peut être dans un état impur meilleure pratique consiste donc mettre fin au processus et à le redémarrer pour nous assurer de démarrer avec un état propre. Maintenant, vous vous demandez peut-être, si nous mettons fin au processus, comment allons-nous le redémarrer en production ? Eh bien, il existe des outils pour cela, que nous appelons des gestionnaires de processus. Et à l'avenir, nous allons examiner l'un d'entre eux. Je vais donc modifier ce code, et nous supprimons simplement la propriété exit en cas d'erreur, car par défaut, Winston se ferme après avoir enregistré une exception non détectée ou un rejet non géré Une question que vous pourriez vous poser est de savoir si vous devez enregistrer les messages dans un fichier ou dans une base de données telle que Manga Div. Les opinions divergent à ce sujet, mais je pense personnellement que vous devriez utiliser les deux moyens de transport, car chaque transport a ses forces et ses faiblesses. Manga Di B ou d'autres bases de données sont utiles pour interroger des données. Ainsi, si vous souhaitez créer une application cliente pour interroger votre journal, il est beaucoup plus facile d' interroger les données dans Mongo DB plutôt que dans un fichier plat comme celui-ci Cependant, il est possible que votre serveur de base de données Mongo tombe en panne ou que vous ne puissiez pas vous y connecter pour une raison quelconque Dans ce cas, il est préférable d'utiliser le système de fichiers car le système de fichiers est toujours disponible. Dans un environnement de production, rejets de promesses non gérés peuvent passer inaperçus Ainsi, nous avons créé une piste d'audit indiquant ce qui s'est mal passé et pourquoi. Et c'est ainsi que l'on gère les refus non gérés avec Winston Qu'il s'agisse d'exceptions absolues ou de refus de promesses, Winston vous aide à maintenir visibilité et la fiabilité 11. Extraire des routes: Très bien, voici le code en index ou en JS. Le principal problème que nous avons ici est l'absence de séparation des préoccupations. Il se passe tellement de choses ici, et c'est pourquoi nous avons un grand nombre d' instructions obligatoires en haut de ce module. En dessous, vous pouvez voir que nous avons un code de configuration. Ensuite, nous avons quelque chose de complètement différent, qui consiste à se connecter à la base de données Mongo Di Ba Ensuite, nous passons à la configuration de nos itinéraires dans divers intergiciels Ce sont là des préoccupations différentes. Ils ne doivent pas être mélangés dans un seul fichier ou un seul module. Dans ce module, nous ne devons qu'orchestrer ces préoccupations Les détails les concernant doivent donc être déplacés vers différents modules. Par exemple, les détails de la configuration des itinéraires ou les détails de la connexion à base de données Mongo DB doivent être séparés Dans cette conférence, nous allons donc nous concentrer sur l' extraction des routes dans un module distinct Créons donc un nouveau dossier appelé initialize. Ici, je vais ajouter un nouveau fichier routes point JS, et ici nous devrions exporter une fonction. Donc le module point Exports. Nous lui attribuons une fonction. Maintenant, dans cette fonction, je vais ajouter tout le code pour configurer nos itinéraires et autres intergiciels Donc, de retour dans index ou Js, je vais couper tout le code et le déplacer ici. Regardez donc les dépendances ici. Nous dépendons des objets d' application à exprimer, tous ces routeurs, tels que les entreprises, les clients, etc. Donc, de retour dans l'index ou Js en haut de la ligne 14, voici comment nous créons l'objet de l'application. Nous devrions en avoir une seule instance dans l' ensemble de l'application. En d'autres termes, nous ne voulons pas charger Express puis l'appeler pour créer un objet d'application dans notre nouveau module. Nous voulons donc envoyer une référence à cette application à ce nouveau module. Cette fonction doit donc prendre app comme argument. D'accord ? Maintenant, de retour dans index ou Js, nous avons ici l'objet de l'application. Nous pouvons charger notre nouveau module qui est des routes initialisées. Cela renvoie une fonction, nous l'appelons donc et lui transmettons l'objet de l'application. C'est ça. C'est tout ce que nous avons à faire. Maintenant, nettoyons ce module. Donc, tous ces routeurs que nous avons importés ici, comme les entreprises, les clients, etc., devraient tous être déplacés vers notre nouveau module car nous ne les avons référencés nulle part ailleurs dans le module d'index Alors réduisez ici, collez-les sur le dessus. Nous avons ajouté la plupart des dépendances. Nous avons également besoin d'Express et du middleware d'erreur. Nous pouvons donc charger l'Express sur le dessus, const Express. Exige Express. Maintenant, pour ce qui est du middleware d'erreur, je vais le retirer de index ou de Js car c'est le seul endroit où vous faites référence à cette le seul endroit où vous faites référence Voici notre intergiciel d'erreur. Réduisez le nombre de routes ou de JS, et ajoutons-le ici. Maintenant, revenons à index ou à Js, vous pouvez voir que le noyau de ce module est déjà beaucoup plus court. Nous n'avons plus autant d'instructions requises, et l'implémentation est également un peu plus propre. Enfin, revenons au module routes, nous devons changer les chemins d'accès à ces routeurs car le dossier des routes ne se trouve pas dans le dossier initialisé Donc, chaque fois que nous aurons une barre oblique périmétrique, je vais la remplacer par une J'ai donc sélectionné ici ces deux personnages. Dans le code VS, nous pouvons activer l'édition multi-curseurs. Je maintiens les touches Ctrl et D enfoncées sous Windows. Si vous utilisez un Mac, le raccourci est probablement Command D. Donc, vous voyez, je sélectionne plusieurs instances puis nous pouvons toutes les remplacer en une seule fois. Donc, point final. Terminé. 12. Extraire la logique de la capture: Voici notre intergiciel Error Js. Dans cette conférence, nous allons déplacer tout le code de configuration de journalisation avec un module différent. C'est tout ce qui est lié à Winston et à la gestion des promesses rejetées et des exceptions non prises Donc, dans le dossier initialisé, ajoutons un nouveau fichier en enregistrant point js, puis en saisissant à nouveau point js d'erreur Prenez tout ce code pour configurer Winston. Récupérez-le et déplacez-le vers logging point s ici. Maintenant, nous devons exporter cet enregistreur, donc le module point Exports Et nous voulons l'appeler Logger. Alors logger, nous l'avons défini sur Logger. Revenons maintenant à l'index point js. Je voudrais également déplacer cette instruction require pour gérer les erreurs asynchrones dans Express Je préfèrerais le mettre dans notre module de journalisation, qui traite de la gestion et de la journalisation des erreurs. Coupons-le à partir d'ici et collons-le dans le module logging dot js. Enfin, nous devons revenir à index point js et charger le module de journalisation. Require initialise la journalisation. Notez que je l'ai mis en premier. Donc, juste au cas où nous aurions une erreur lors du chargement d'autres modules, pour nous assurer de verrouiller cette erreur et de mettre fin au processus. Nous en avons donc terminé avec cette refactorisation en tant qu'exercice. Je veux que vous déplaciez tout le code pour gérer l'initialisation de la base de données vers un module séparé appelé dbdt Js Vous aurez ma solution lors de la prochaine conférence. 13. Extraire la logique de la base de données: Ici, dans index point JS, c' est le seul code dont nous disposons pour l' initialisation de la base de données Donc, ici, dans le dossier initialisé, ajoutons un nouveau fichier, dw point JS Et ici, nous allons exporter une fonction. Donc le module point Exports. Nous lui attribuons une fonction. Et puis déplacez tout le code d' initialisation de la base de données ici Maintenant, je vais apporter quelques modifications ici. Tout d'abord, lorsque nous nous connectons, je ne veux pas faire de consultation dans le journal. Je préfère enregistrer cela comme un message informatif en utilisant Winston Donc, en haut, chargeons notre enregistreur pour exiger la journalisation. Et nous devons déstructurer l'enregistreur, donc l'enregistreur Canst Cebrass. Alors pourquoi le restructurons-nous ? Si vous vous souvenez, dans le point de journalisation js, nous avons attribué l'objet logger en tant que propriété du module point exports Pour accéder à la propriété de l' enregistreur, vous devez donc la déstructurer Je l'ai fait exprès pour un petit rappel. Revenons maintenant à db dot js. Comme nous avons maintenant notre enregistreur, nous pouvons remplacer cette console qui enregistre par logger point info Nous devons également supprimer cette méthode de cache car si nous ne pouvons pas nous connecter à Mongo Di B, nous voulons enregistrer cette exception et terminer le processus Avec l'implémentation actuelle, nous gérons cette promesse rejetée ici même, et nous ne faisons qu' afficher ce message sur la console. Nous n'enregistrons donc pas cela. Nous n'allons pas mettre fin au processus. Je l'utilise ici spécifiquement à des fins de démonstration, mais avec la nouvelle implémentation, nous n'en avons pas besoin. Supprimons donc ceci et enfin, nous devons importer la mangouste par le haut Je vais le retirer du module indexé ou Js. Donc, de retour en indexé ou en Js en haut, je vais supprimer cette ligne pour importer mangouste, puis la mettre ici Voici donc notre module de base de données. Vous pouvez voir que le code est très clair, très court. Nous avons une seule responsabilité. Nous n'avons pas trop de choses mélangées. Enfin, nous devons charger ce module en index ou en Js. Donc ici, je vais appeler require initialize DV. Ici, nous obtenons une fonction, c' est pourquoi nous l'appelons. Vérifions-le maintenant avec notre implémentation actuelle. Si nous ne parvenons pas à nous connecter à la base de données lors de l' initialisation de l'application, cette exception sera enregistrée et le processus sera arrêté. Ouvrez donc un nouveau terminal. Je vais arrêter le processus Mongo DB avec le nom de service d' arrêt Mongo Et puis revenons à notre fenêtre de terminal, node, indexed ou Js. Voici donc notre rejet non géré Le processus est terminé. Et si vous regardez le journal à points des rejets, nous pouvons voir que le rejet est enregistré ici. Magnifique. C'est pourquoi je vous ai dit nous devrions supprimer la méthode de cache ici et laisser notre gestionnaire d'erreurs global gérer cette promesse rejetée Voici votre prochain exercice. Je veux que vous reveniez à index ou à Js et extrayiez tout le code pour gérer la configuration dans un module séparé. Je parle donc plus précisément de ces quelques lignes où nous recherchons les paramètres de configuration essentiels lors de l' initialisation de l'application Vous verrez ensuite ma solution. 14. Extraire la logique de configuration: C'est bon. Commençons par ajouter un nouveau fichier dans le dossier initialisé Donc, le point de configuration est. Encore une fois, nous exportons une fonction. Maintenant, de retour dans index ou Js, nous reprenons tout le code pour enregistrer les paramètres de configuration dans ce nouveau module. Nous avons donc ici une dépendance à ce module de configuration. Je vais donc l'obtenir à partir de index point js et le charger en haut de ce module. OK, donc si nous n'avons pas ce paramètre de configuration, nous ne voulons pas enregistrer quelque chose sur la console. Nous voulons plutôt enregistrer cela comme une erreur fatale dans notre journal. Ainsi, au lieu de faire une erreur par point dans la console et de sortir du point de traitement, il est préférable de lancer une exception, puis notre infrastructure actuelle détectera cette exception, l' enregistrera et terminera le processus. Nous lançons donc une nouvelle erreur et utilisons le message d'erreur. De plus, il est recommandé toujours lancer des objets d'erreur au lieu de chaînes, même si vous pouvez le faire en JavaScript. Parce que lorsque vous lancez un objet d'erreur, cette trace de pile sera disponible pour que vous puissiez la consulter ultérieurement. Si vous lancez une chaîne contenant le message d'erreur, vous n'aurez pas la trace de la pile. OK, c'est donc une autre bonne pratique à connaître. Enfin, revenons à index ou à Js et chargeons ce nouveau module. Exigez donc une initialisation, une configuration flash. C'est une fonction, c'est ainsi que nous l'appelons. Maintenant, testons-le. Avant cela, je dois démarrer le service Manga DV. Donc, de retour dans le terminal, lançons le nom du service de démarrage Manga DV OK, maintenant nous devons repartir à zéro. Fermez donc tous les terminaux, ouvrez un nouveau terminal comme celui-ci et exécutez nod index point JS. Bien, le processus est donc terminé, mais rien n'est enregistré sur la console. si vous regardez ce fichier, vous pouvez voir pourquoi notre application s'est écrasée. Erreur Patel, la clé secrète JWD n'est pas définie. C'est une bonne chose pour un environnement de production. Mais si vous donnez cette application à un nouveau développeur et qu'il l'exécute, il n'a aucune idée de ce qui se passe. Ainsi, dans notre implémentation actuelle, nous utilisons uniquement un transport de fichiers pour les exceptions non détectées Nous devrions donc également ajouter un transport de console pour afficher les exceptions non détectées sur la console Donc, nouvelle console de transport Winston Dot. Et c'est tout. Revenons au terminal et exécutons l'application une fois de plus. Vous pouvez voir que la raison pour laquelle notre application a échoué est que nous n'avons pas défini de clé privée JWT Maintenant, je veux te montrer quelque chose. Revenez donc à l'index dot js. Regardez le fichier JS à points d'index. Nous n'avons que 13 lignes de code ici. Tu te souviens de ce que nous avions avant ? Je pense que nous avions 30 à 40 lignes de code avec une très mauvaise séparation des préoccupations. Avec cette nouvelle refonte, nous ne faisons qu'une chose : configurer l'application Les détails de la journalisation, les détails des itinéraires, les détails de la base de données et d'autres aspects sont délégués à d'autres modules. Dans la pratique, il s'agit d'un principe de responsabilité unique. Bien qu'il soit encore possible de le refactoriser, nous pouvons déplacer cette configuration de joy et ce code ici, qui est chargé de gérer la configuration du serveur et de le démarrer Je vous le laisse donc en tant que mission de cette section.