E-NO
Dépannage Node.js 8 min de lecture

Dépannage de Node.js avec exemples pratiques : guide terrain pour développeurs et équipes DevOps

calendar_today Publié : 2026-09-27
update Dernière mise à jour : 2026-09-27
analytics Efficacité SEO : 100%
Illustration du guide technique pour « Dépannage de Node.js avec exemples pratiques : guide terrain pour développeurs et équipes DevOps ».

Apprenez à diagnostiquer et corriger les problèmes courants de Node.js à l'aide de commandes pratiques, d'analyse de journaux et de procédures de récupération pas à pas. Ce guide couvre les vérifications de version, la sécurité de la configuration, les diagnostics de performance, les modes de défaillance et une liste de contrôle opérationnelle pour garder vos applications en bonne santé.

Introduction

Node.js alimente un vaste écosystème d'applications web, d'API et de microservices. Lorsqu'un problème survient, une approche structurée du dépannage peut faire gagner des heures de tâtonnements. Ce guide fournit des exemples pratiques et des commandes pour vous aider à identifier, diagnostiquer et résoudre les problèmes courants de Node.js, qu'il s'agisse d'erreurs de configuration ou de fuites de mémoire. En suivant les étapes décrites ici, vous pouvez mettre en place un processus reproductible qui améliore la fiabilité de vos applications et réduit les temps d'arrêt.

Ce guide s'adresse aux développeurs et aux ingénieurs DevOps qui doivent assurer le bon fonctionnement des services Node.js. Chaque section comprend des commandes concrètes, les résultats attendus et des explications. Que vous répondiez à un incident ou effectuiez une maintenance de routine, les techniques ci-dessous vous aideront à travailler plus rapidement et avec plus de confiance.

Inventaire de la version et de l'environnement

Avant de modifier quoi que ce soit, rassemblez des informations précises sur votre environnement Node.js. Cela inclut la version de Node.js, la version de npm, le système d'exploitation, l'architecture et les versions des paquets pertinents. Connaître ces détails vous aide à reproduire les problèmes et à éviter d'en introduire de nouveaux.

Commencez par vérifier les versions de Node.js et de npm :

node -v
npm -v

Le résultat attendu peut ressembler à ceci :

v18.17.1
9.6.7

Si vous utilisez un gestionnaire de versions comme nvm, listez les versions installées et la version actuelle :

nvm ls
nvm current

Pour le système d'exploitation et l'architecture, utilisez :

uname -a

Sur un système Linux typique, vous pourriez voir :

Linux hostname 5.15.0-91-generic #101-Ubuntu SMP Tue Nov 14 13:30:08 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

Vérifiez les dépendances du projet en examinant package.json et package-lock.json. Utilisez npm ls pour lister les paquets installés et leurs versions :

npm ls --depth=0

Le résultat attendu peut être :

[email protected] /path/to/my-app
├── [email protected]
├── [email protected]
└── [email protected]

Comprendre votre environnement signifie aussi connaître la topologie réseau : quels services votre application Node.js contacte-t-elle (bases de données, caches, API externes) et comment sont-ils configurés via des variables d'environnement. Par exemple, si votre application se connecte à une base de données PostgreSQL et à un cache Redis, notez leurs noms d'hôte, ports et identifiants (sans exposer les secrets). Collectez ces détails avant de continuer.

Vous devez également noter le gestionnaire de processus utilisé (PM2, systemd, Docker, Kubernetes) et comment l'application est démarrée. Cette information est essentielle lorsque vous devez redémarrer ou inspecter le service plus tard. Conservez cet inventaire dans un document partagé ou un runbook afin que toute l'équipe puisse y accéder pendant un incident.

Chemin de configuration sécurisé

Les modifications de configuration sont une source fréquente de problèmes Node.js. Pour effectuer des modifications en toute sécurité, suivez ces pratiques :

  • Utilisez des variables d'environnement pour les paramètres sensibles ou spécifiques à l'environnement. Évitez de coder en dur des valeurs dans le code. Par exemple, lisez le port depuis process.env.PORT :
const port = process.env.PORT || 3000;
  • Conservez la configuration en un seul endroit comme un fichier .env chargé avec le paquet dotenv. Cela simplifie la gestion et réduit les erreurs. Exemple de fichier .env :
PORT=3000
DB_URL=mongodb://localhost:27017/myapp
REDIS_URL=redis://localhost:6379
  • Validez la configuration au démarrage. Utilisez une bibliothèque comme joi ou zod pour vous assurer que toutes les variables requises sont présentes et correctes. Voici un exemple simple de validation avec zod :
const { z } = require('zod');
const envSchema = z.object({
  PORT: z.string().default('3000'),
  DB_URL: z.string().url(),
});
const env = envSchema.safeParse(process.env);
if (!env.success) {
  console.error('Invalid environment variables:', env.error.issues);
  process.exit(1);
}
  • Faites des modifications progressivement. Changez une variable à la fois et testez après chaque modification. Par exemple, si vous devez changer la chaîne de connexion à la base de données, faites-le puis exécutez un test de connectivité rapide :
node -e "require('mongodb').MongoClient.connect(process.env.DB_URL, (err, client) => { if(err) console.error(err); else console.log('Connected'); client.close(); })"
  • Utilisez des outils de gestion de configuration comme Ansible ou Terraform pour un déploiement cohérent entre les environnements. Ces outils vous aident à suivre les modifications et à revenir en arrière si nécessaire.

Documentez toujours les modifications de configuration dans un journal des modifications ou un message de commit de contrôle de version pour la traçabilité. Un bon message de commit pourrait être : « Augmenter la taille du pool de base de données à 20 pour gérer la charge de pointe ». Cela facilite l'identification de ce qui a changé lorsqu'un problème survient.

Vérification et diagnostics

Après avoir apporté des modifications ou lors de l'investigation d'un problème, vous devez vérifier le comportement du système et diagnostiquer les causes racines. Voici des techniques pratiques :

Vérifier l'état du processus

Votre processus Node.js est-il en cours d'exécution ? Utilisez ps pour voir les processus :

ps aux | grep node

La sortie affichera des détails tels que l'ID du processus (PID), l'utilisation du CPU et de la mémoire. Par exemple :

user 12345 0.5 1.2 123456 78901 ? Ssl 10:00 0:03 node server.js

Si le processus n'est pas listé, il a peut-être planté. Recherchez les journaux de crash ou vérifiez l'état du gestionnaire de processus :

pm2 status
# ou
systemctl status my-node-app

Examiner les journaux

Les journaux sont le premier endroit à vérifier pour les erreurs. Si votre application journalise vers stdout/stderr, vous pouvez les rediriger vers un fichier :

node server.js > app.log 2>&1

Ensuite, visualisez le journal avec tail ou less :

tail -f app.log

Recherchez les traces de pile, les codes d'erreur et les messages d'avertissement. Par exemple, un rejet de promesse non géré peut journaliser :

(node:12345) UnhandledPromiseRejectionWarning: Error: connect ECONNREFUSED 127.0.0.1:27017

Cela indique que l'application Node.js n'a pas pu se connecter à MongoDB sur le port par défaut. Les motifs de journaux courants incluent :

  • EADDRINUSE : Port déjà utilisé.
  • ECONNREFUSED : Connexion refusée par le service cible.
  • ETIMEDOUT : Délai de connexion expiré.
  • SyntaxError : Erreur d'analyse du code.

Utilisez des bibliothèques de journalisation structurée comme pino ou winston pour produire des journaux JSON plus faciles à analyser et à rechercher. Par exemple, avec pino :

const pino = require('pino');
const logger = pino();
logger.info({ user: 'alice' }, 'User logged in');

Utiliser les outils de débogage

Node.js dispose d'un débogueur intégré. Démarrez votre application en mode débogage :

node inspect server.js

Ensuite, vous pouvez définir des points d'arrêt et parcourir le code. Pour un débogage plus avancé, utilisez le protocole Chrome DevTools en exécutant :

node --inspect server.js

Ouvrez ensuite chrome://inspect dans Chrome pour vous attacher. Cela vous donne une interface de débogage complète avec des points d'arrêt, des expressions de surveillance et l'inspection de la pile d'appels.

Diagnostics de performance

Pour diagnostiquer les problèmes de performance tels que des réponses lentes ou une utilisation élevée du CPU, utilisez le drapeau intégré --prof pour générer un profil CPU :

node --prof server.js

Après qu'il ait fonctionné un certain temps, arrêtez-le et traitez le profil avec :

node --prof-process isolate-*.log > processed.txt

Inspectez le fichier traité pour trouver les points chauds. Recherchez les fonctions avec des pourcentages élevés de « ticks » ou « total ». Par exemple :

 [Summary]:
   ticks  total  nonlib   name
    102    5.2%   10.4%  JavaScript
     86    4.4%    8.8%  C++
     42    2.1%    4.3%  GC

Pour les problèmes de mémoire, prenez des instantanés de tas en utilisant --inspect et l'onglet Mémoire de Chrome DevTools, ou utilisez process.memoryUsage() dans votre code pour journaliser périodiquement les statistiques de mémoire :

setInterval(() => {
  const mem = process.memoryUsage();
  console.log(`RSS: ${mem.rss}, Heap Used: ${mem.heapUsed}, Heap Total: ${mem.heapTotal}`);
}, 10000);

Vérifiez le retard de la boucle d'événements pour détecter le code bloquant. Vous pouvez utiliser une bibliothèque comme blocked ou le mesurer vous-même :

const { monitorEventLoopDelay } = require('perf_hooks').performance;
const h = monitorEventLoopDelay();
h.enable();
setInterval(() => {
  console.log(`Event loop delay: ${h.mean} ms`);
}, 1000);

Un retard élevé (par exemple, >50 ms) indique une boucle d'événements bloquée.

Modes de défaillance et récupération

Les applications Node.js peuvent échouer de diverses manières. Comprendre les modes de défaillance courants vous aide à préparer des stratégies de récupération.

Exceptions non interceptées et rejets non gérés

Si une exception n'est pas interceptée, le processus se terminera. Ajoutez des gestionnaires globaux pour journaliser et éventuellement redémarrer :

process.on('uncaughtException', (err) => {
  console.error('Uncaught exception:', err);
  process.exit(1); // beaucoup recommandent de quitter
});

process.on('unhandledRejection', (reason, promise) => {
  console.error('Unhandled rejection at:', promise, 'reason:', reason);
});

Mieux encore, utilisez un gestionnaire de processus comme PM2 pour redémarrer automatiquement en cas de crash :

pm2 start server.js --name my-app
pm2 save
pm2 startup

PM2 capturera également les journaux et fournira un tableau de bord. Alternativement, utilisez systemd avec Restart=always dans le fichier de service.

Fuites de mémoire

Une fuite de mémoire peut entraîner l'épuisement de la mémoire du processus et un crash. Utilisez --max-old-space-size pour augmenter temporairement la taille du tas, mais la véritable solution est d'identifier et de corriger la fuite. Prenez des instantanés de tas au fil du temps et comparez-les pour trouver les objets qui ne sont pas libérés.

Exemple de flux de travail :

  1. Démarrez l'application avec node --inspect server.js
  2. Ouvrez Chrome DevTools et attachez-vous.
  3. Allez dans l'onglet Mémoire, prenez un instantané de tas.
  4. Générez de la charge, attendez, prenez un autre instantané.
  5. Comparez les instantanés et recherchez les objets avec des compteurs en augmentation.

Les sources de fuites courantes incluent les variables globales, les fermetures conservant des références et les écouteurs d'événements non supprimés. Corrigez la cause racine.

Boucle d'événements bloquée

Les opérations bloquantes comme les entrées/sorties de fichiers synchrones ou les boucles intensives en CPU peuvent geler la boucle d'événements. Évitez les fonctions synchrones dans le code de production. Utilisez worker_threads pour les tâches liées au CPU.

Exemple de mauvais code :

const fs = require('fs');
const data = fs.readFileSync('/path/to/large/file'); // bloque la boucle d'événements

Mieux :

const fs = require('fs');
fs.readFile('/path/to/large/file', (err, data) => {
  // gérer de manière asynchrone
});

Erreurs de configuration

Si l'application ne démarre pas en raison de variables d'environnement manquantes ou d'une configuration invalide, elle se termine souvent immédiatement avec une erreur. Utilisez la technique de validation vue précédemment pour détecter ces problèmes tôt.

Problèmes réseau

Les délais d'attente et les erreurs de connexion refusée sont courants. Utilisez curl pour tester les points de terminaison, et vérifiez les règles de pare-feu et la disponibilité des services.

curl -I http://localhost:3000

Le résultat attendu inclut le statut HTTP comme HTTP/1.1 200 OK. Pour la connectivité de la base de données, utilisez un one-liner Node.js rapide comme montré précédemment.

Étapes de récupération

  • Redémarrez l'application si elle est en panne. Utilisez PM2 ou systemd :
pm2 restart my-app
# ou
sudo systemctl restart my-node-app
  • Vérifiez les journaux pour la cause racine avant de redémarrer pour éviter de perdre des informations. Sauvegardez les journaux dans un fichier si nécessaire.
  • Annulez les modifications de configuration si vous soupçonnez qu'un changement récent a causé le problème. Si vous utilisez Git, revenez à un commit précédent :
git revert <commit-hash>
  • Restaurez à partir d'une sauvegarde si une corruption de données s'est produite. Assurez-vous d'avoir des sauvegardes régulières des bases de données et des fichiers importants.
  • Mettez à jour les dépendances si un bug connu est en cause. Mais testez les mises à jour dans un environnement de préproduction d'abord :
npm update <package-name>

Après la récupération, effectuez un post-mortem pour documenter l'incident et améliorer la surveillance.

Pièges courants et comment les éviter

Les développeurs Node.js expérimentés tombent souvent dans les mêmes pièges. Voici les erreurs courantes et comment les éviter ou s'en remettre.

Ignorer les différences d'environnement

Problème : Le code fonctionne localement mais échoue en production en raison de versions de Node.js ou de variables d'environnement différentes.

Pourquoi cela arrive : Les développeurs supposent que l'environnement de production correspond à leur configuration locale.

Comment éviter : Utilisez Docker pour standardiser les environnements, ou au moins fixez les versions de Node.js dans package.json avec le champ "engines" :

{
  "engines": {
    "node": ">=18.0.0"
  }
}

Utilisez nvm ou un gestionnaire de versions en développement pour correspondre à la production.

Ne pas gérer correctement les erreurs asynchrones

Problème : Les rejets de promesses non gérés font planter le processus ou le laissent dans un état incohérent.

Pourquoi cela arrive : Oublier d'await une promesse ou ne pas ajouter de gestionnaires .catch().

Comment éviter : Utilisez async/await de manière cohérente et enveloppez dans try/catch. Activez --unhandled-rejections=strict pour échouer rapidement en développement :

node --unhandled-rejections=strict server.js

Utiliser excessivement les méthodes synchrones

Problème : Les opérations de fichiers ou de réseau synchrones bloquent la boucle d'événements, provoquant des ralentissements et des délais d'attente.

Pourquoi cela arrive : Commodité ou méconnaissance des alternatives asynchrones.

Comment éviter : Utilisez les versions asynchrones des méthodes (fs.promises.readFile au lieu de fs.readFileSync). Utilisez des règles de lint comme no-sync dans ESLint.

Négliger les mises à jour de sécurité

Problème : Des vulnérabilités connues dans les dépendances sont exploitées.

Pourquoi cela arrive : Les équipes oublient d'exécuter npm audit régulièrement.

Comment éviter : Exécutez npm audit dans le pipeline CI et après chaque modification de dépendance. Utilisez npm audit fix pour appliquer des mises à jour sûres.

Mal configurer les gestionnaires de processus

Problème : L'application ne redémarre pas en cas de crash ou ne démarre pas au démarrage.

Pourquoi cela arrive : Drapeau --update-env manquant ou configuration incorrecte de PM2 save/startup.

Comment éviter : Utilisez toujours pm2 save après les modifications et assurez-vous que pm2 startup est configuré. Testez en redémarrant le serveur ou en simulant un crash.

Liste de contrôle opérationnelle

Utilisez cette liste de contrôle pour les opérations de routine et lors du dépannage. Chaque élément comprend la commande ou l'action, le résultat attendu et le propriétaire responsable de cette vérification.

TâcheCommande / ActionRésultat attenduPropriétaireFréquence
Vérifier la version de Node.jsnode -vAfficher la version (par ex., v18.17.1)Ingénieur DevOpsHebdomadaire
Vérifier la version de npmnpm -vAfficher la versionIngénieur DevOpsHebdomadaire
Lister les paquets installésnpm ls --depth=0Liste des dépendances de premier niveauDéveloppeur backendHebdomadaire
Vérifier l'état du processusps aux | grep nodeProcessus Node.js listé avec PIDIngénieur DevOpsQuotidien
Consulter les journaux d'applicationtail -f app.logSortie de journal en temps réelDéveloppeur backendPendant les incidents
Tester le point de terminaison HTTPcurl -I http://localhost:3000En-têtes de réponse HTTP avec 200 OKIngénieur QAAprès les déploiements
Vérifier la connectivité de la base de donnéesnode -e "require('mongodb').MongoClient.connect('mongodb://localhost:27017/test', (err, client) => { if(err) console.error(err); else console.log('Connected'); client.close(); })"Message « Connected » ou erreurDéveloppeur backendQuotidien
Vérifier l'utilisation de la mémoireps -o rss= -p <PID>Taille du jeu résident en KoIngénieur DevOpsToutes les heures via la surveillance
Vérifier la santé de la boucle d'événementsUtiliser monitorEventLoopDelay ou clinic doctorFaible retard moyen (<10 ms)Développeur backendPendant les tests de performance
Exécuter le linternpm run lintAucune erreur ni avertissementDéveloppeur backendÀ chaque commit
Exécuter les testsnpm testTous les tests passentIngénieur QAÀ chaque fusion
Vérifier les paquets obsolètesnpm outdatedListe des paquets avec des versions plus récentesIngénieur DevOpsMensuel
Sauvegarder la configurationcp .env .env.backupFichier de sauvegarde crééIngénieur DevOpsAvant les modifications de configuration
Vérifier les vulnérabilités de sécuriténpm auditRapport avec vulnérabilités (devrait être zéro)Ingénieur sécuritéHebdomadaire
Vérifier l'espace disquedf -hEspace libre suffisant (>20 %)Ingénieur DevOpsHebdomadaire
Surveiller la charge CPUtop ou htopCharge moyenne inférieure au nombre de cœursIngénieur DevOpsPendant un trafic élevé
Tester le basculement/redémarrageSimuler un crash et vérifier la récupérationLe processus redémarre dans les 30 secondesIngénieur DevOpsTrimestriel
Examiner les post-mortems d'incidentsDocumenter et attribuer des actionsToutes les actions terminéesResponsable d'ingénierieAprès chaque incident

Effectuer régulièrement ces vérifications peut détecter les problèmes avant qu'ils n'affectent les utilisateurs. Attribuez chaque vérification à un seul propriétaire (pas à une équipe) pour garantir la responsabilité. Révisez la liste de contrôle chaque trimestre pour ajuster les fréquences et les tâches en fonction des changements du système.

Conclusion

Le dépannage de Node.js nécessite une approche méthodique : connaître votre environnement, apporter des modifications de configuration en toute sécurité, vérifier avec des diagnostics observables et se préparer aux modes de défaillance avec des plans de récupération. En utilisant les exemples pratiques de ce guide, vous pouvez réduire les temps d'arrêt et améliorer la fiabilité de vos applications Node.js. Commencez par mettre en œuvre la liste de contrôle opérationnelle dans votre flux de travail quotidien et créez une culture de surveillance et de journalisation proactives. L'étape suivante consiste à intégrer ces pratiques dans vos processus de développement et de déploiement.

N'oubliez pas que le dépannage ne consiste pas seulement à corriger les problèmes, mais aussi à les prévenir. Une maintenance régulière, une propriété claire et un apprentissage continu sont essentiels pour garder les applications Node.js en bonne santé. Utilisez ce guide comme référence, adaptez-le à votre pile technologique et partagez-le avec votre équipe pour construire un playbook de dépannage commun.

Recherches connexes

Score de qualité de l’article

Utilité pour le lecteur 100%
  • check_circle Guide prêt à lire
  • check_circle Exemples pratiques inclus
  • check_circle URL d’article optimisée pour le SEO