6.2 · Dépannage express

Niveau 6 · Dans la pratique

6.2Dépannage express

Objectif : transformer la maîtrise technique de Node en réflexes de production fiables, performants et sûrs.
Temps estimé : 14 min · Si vous n'avez que 5 min : lisez « L'essentiel en 30s » + le schéma.

L'essentiel en 30 secondes

  • Réflexe : un symptôme = des causes probables = une action ciblée — on diagnostique avant de relancer.
  • Boucle : un serveur qui gèle ou plante signale presque toujours l'asynchrone ou les erreurs non gérées.
  • Production : tout écart entre local et production se traite par conteneur, variables d'environnement et logs.

Fil Salim — le playbook scotché à côté de l'écran

Salim garde ce playbook à côté de son écran. Verdict après un an : trois lignes l'ont le plus servi — le undefined d'un résultat pas encore prêt, le serveur qui gèle sous plusieurs utilisateurs, et le secret qui a failli partir dans Git. Pour chacune, il a fini par appliquer la séquence (vérifier, corriger la cause, tester) au lieu de relancer au hasard.

Symptôme observé, causes vérifiées, actions dans l'ordre : le réflexe tient en trois temps.

Diagnostiquer avant de relancer

Un problème Node se résout rarement au hasard : chaque symptôme a des causes typiques et une action ciblée. Le tableau ci-dessous regroupe les situations les plus fréquentes, de l'asynchrone au déploiement.

SymptômeCauses probablesActions
J'obtiens undefined au lieu de mon résultatcode asynchrone mal géré : le résultat n'est pas prêt à la ligne suivanteutiliser await (fonction async) ou .then() ; penser « quand c'est prêt » ; entourer de try/catch (1.2)
UnhandledPromiseRejection / le serveur plantepromise rejetée non gérée ; pas de gestion d'erreurs centraliséeentourer await de try/catch ; middleware d'erreurs centralisé (err, req, res, next) ; gérer l'événement 'error' (4.4)
Le serveur « gèle » dès plusieurs utilisateursopération synchrone (fs.*Sync) ou calcul CPU lourd bloquant la boucle d'événementspasser en asynchrone (fs.promises) ; déléguer le CPU aux worker threads ; ne jamais bloquer la boucle (2.1/5.2)
Cannot find module / erreur d'importmauvais chemin, node_modules absent, confusion CommonJS / ESMnpm install ; vérifier ./ pour le local contre nom pour npm ; cohérence require contre import ('type':'module') (1.3)
req.body est undefined dans Expressmiddleware de parsing manquant ou placé après les routesajouter app.use(express.json()) AVANT les routes ; vérifier le Content-Type (3.1)
Doublons ou données incohérentes en basepas de contrainte ni validation ; pas de recherche avant créationschéma validé (required, unique) ; rechercher puis créer/mettre à jour ; relier plutôt que dupliquer (3.3)
Faille potentielle : injection / données non fiablesconcaténation d'entrées dans une requête ; entrées non validéesrequêtes paramétrées ou ORM ; valider les entrées (Zod/Joi) ; ne jamais faire confiance au client (3.4/4.2)
Mon API est lente sous chargerequêtes non optimisées (N+1, pas d'index) ; pas de cache ; un seul cœur utiliséprofiler AVANT de toucher ; indexer et optimiser les requêtes ; cache (Redis) ; clustering (PM2) (5.2)
« Ça marche chez moi » mais pas en productionenvironnement différent (version Node, dépendances, configuration)conteneuriser (Docker) ; config par variables d'environnement ; vérifier les versions (5.3)
Un secret a fuité (clé/API dans le code ou Git)secret en clair dans le code ou versionnérégénérer immédiatement la clé ; déplacer en variable d'environnement (.env ignoré par Git) ; ne jamais versionner .env (1.4/4.2)
Erreur d'interprétation fréquente : « le playbook remplace le diagnostic ». Non. Le tableau donne des causes probables, pas un verdict : vérifiez (logs, versions, configuration) puis appliquez l'action ciblée du niveau indiqué.
Version texte du schéma (SEO / lecteurs d'écran / traduction) : Méthode du playbook : 1) Nommer le symptôme observé (undefined, plantage, gel, import, body vide, doublons, injection, lenteur, écart prod, secret). 2) Retenir les causes probables du tableau sans conclure seul. 3) Appliquer les actions dans l'ordre (await + try/catch, async, parsing, validation, index, Docker, .env). 4) Consulter les logs et documenter pour éviter la récidive. Leçon : un symptôme qui revient appelle un réflexe, pas des relances au hasard.

Script prêt à dire — diagnostiquer sans relancer au hasard (30 s)

« Mon symptôme : [undefined / plantage / gel / body vide / lenteur / écart prod]. Je consulte les logs, j'identifie la cause probable du playbook, j'applique l'action ciblée et je vérifie. »

Modèle copier-coller — fiche panne express

// Fiche panne : await + try/catch + middleware d'erreurs
async function chargerTache(id) {
  try {
    const tache = await trouverTache(id);
    return tache;
  } catch (erreur) {
    throw new Error("Lecture impossible");
  }
}
function gestionErreurs(err, req, res, next) {
  console.error(err.message);
  res.status(500).json({ erreur: "Erreur interne" });
}
module.exports = { chargerTache, gestionErreurs };

TPE / petit budget

Pas de tableau formel : un symptôme, la cause probable du playbook, l'action et le responsable noté.

PME Algérie

Intégrer les réalités locales dans le diagnostic : versions installées, postes partagés, pics d'activité connus.

Remote / hybride

Ajouter les logs écrits immédiats aux actions : à distance, un symptôme non consigné ressemble à un système qui marche.

Interculturel

Expliciter les constats par écrit : ce qui semble évident (quelle version, quel environnement) ne l'est pas pour tous.

Prudence : Rappel générique : en cas de secret exposé (clé en clair, fuite dans Git), régénérez la clé immédiatement, déplacez-la en variable d'environnement et faites valider par le référent désigné ; ce guide ne donne pas d'avis juridique.

Défi 48h — appliquez demain

Repérez 1 symptôme actuel (undefined, gel, body vide, lenteur), remplissez la fiche panne express et testez la 1re action (logs + correction ciblée).

Checklist sortie de section
  • Je sais relier un symptôme à ses causes probables.
  • J'ai rempli (ou planifié) une fiche panne express.
  • Je connais le renvoi vers le niveau à creuser pour mon cas.
Auto-évaluation 1-5 : diagnostic avant relance ?logs et secrets traités correctement ?
Vérifiez votre compréhension

Le serveur de Salim gèle dès que plusieurs utilisateurs se connectent. Quel réflexe applique le playbook ?

💡

Un même symptôme qui revient n'est pas dix pannes : c'est un réflexe manquant à ancrer (await + try/catch, jamais de Sync en serveur, parsing avant les routes, validation, .env).