đŸ’„ « Ça marche en local, mais ça a explosĂ© en production » – Histoires

đŸ’„ « Ça marche en local, mais ça a explosĂ© en production » – Histoires

La rĂ©alitĂ© Local ≠ Prod (douloureuse, drĂŽle et instructive)

Le parcours professionnel d’un dĂ©veloppeur passe gĂ©nĂ©ralement par trois Ă©tapes :

  • Junior : « Ça marche 🎉 »
  • IntermĂ©diaire : « Et s’il y avait un edge case ? đŸ€” »
  • Senior : « Qu’est-ce que ça va donner en production ? 😐 »

Cet article est lĂ  pour te faire passer de l’étape 2 Ă  l’étape 3.
On va rire, dire « oh non
 », et apprendre des pratiques qui sauvent vraiment des vies en production.

Si tu es prĂȘt, on commence 👇
Prends ton cafĂ© ☕ et ferme les logs de production (pour l’instant).


đŸ§Ș 1ïžâƒŁ Le syndrome des variables d’environnement

« Ça existait en local
 mais en prod, t’es qui ? »

🎭 L’histoire

L’appel API fonctionne parfaitement en local.
Tu dĂ©ploies en production
 BOOM 💣
Erreur 500 – Internal Server Error.

❌ Code problĂ©matique

const apiKey = process.env.API_KEY;

fetch(`https://api.example.com/data?key=${apiKey}`);

🧠 Que se passe-t-il ici ?

  • Le code attend API_KEY
  • Mais en production, cette variable n’est pas dĂ©finie
  • L’API est appelĂ©e avec undefined
  • L’API rĂ©pond :

« Elle est oĂč la clĂ©, mon ami ? »

😇 Pourquoi ça marchait en local ?

Parce que tu avais un fichier .env :

API_KEY=super-secret-key

Réalité en production :

  • Pas de .env
  • Ou au mauvais endroit
  • Ou avec un mauvais nom

✅ Solution solide

const apiKey = process.env.API_KEY;

if (!apiKey) {
  throw new Error("API_KEY n’est pas dĂ©finie ! La production pleure 😭");
}

đŸ› ïž Astuce pratique

  • Valide les variables d’environnement au dĂ©marrage de l’application
  • Ne laisse pas l’explosion arriver en runtime

🧠 Rùgle d’or

« Une application qui tourne avec des variables d’environnement manquantes est une bombe Ă  retardement. »


📁 2ïžâƒŁ La catastrophe des chemins de fichiers

Windows est indulgent. Linux est impitoyable.

🎭 L’histoire

Local : Windows
Production : Linux
Résultat : fichier introuvable


❌ Mauvais code

const filePath = "uploads\\image.png";

😇 Local (Windows)

« Pas de souci, j’ai compris. »

😈 Production (Linux)

« Un backslash ? Mauvais univers. » ❌

✅ Bonne approche

import path from "path";

const filePath = path.join("uploads", "image.png");

🧠 Qu’a-t-on gagnĂ© ?

  • On a ignorĂ© les diffĂ©rences d’OS
  • Le code est devenu portable
  • Un bug de plus enterrĂ© đŸȘŠ

🧠 Rùgle d’or

N’écris jamais les chemins de fichiers Ă  la main. Utilise path.


🔠 3ïžâƒŁ SensibilitĂ© Ă  la casse (majuscules/minuscules)

Le local pardonne. La production jamais.

🎭 L’histoire

AprÚs le déploiement :

Cannot find module './services/userService'

❌ Code

import UserService from "./services/userService";

📁 Fichier rĂ©el :

UserService.js

😇 Local (Mac / Windows)

« Je vois ce que tu veux dire. »

😈 Production (Linux)

« Non. Mauvaise casse. Salut. » 👋

✅ Solution

  • Les noms de fichiers doivent ĂȘtre exacts
  • Les imports doivent correspondre Ă  l’identique
  • Utilise un linter automatique
import UserService from "./services/UserService";

🧠 La production, c’est Linux.

Accepte-le, et la vie sera plus simple.


⏱ 4ïžâƒŁ Les illusions de timing et d’asynchrone

« C’était rapide en local
 »

❌ Code dangereux

let user;

setTimeout(() => {
  user = { name: "Cansu" };
}, 100);

console.log(user.name);

😇 Local

  • CPU tranquille
  • Event loop rapide
  • La chance est avec toi đŸŽČ

😈 Production

  • Trafic Ă©levĂ©
  • Serveur chargĂ©
  • user est toujours undefined đŸ’„

✅ Logique correcte

setTimeout(() => {
  const user = { name: "Cansu" };
  console.log(user.name);
}, 100);

🧠 Qu’a-t-on appris ?

  • Ne jamais faire confiance au timing
  • Faire confiance au scope
  • Utiliser correctement callbacks ou async/await

🧠 Rùgle d’or

Un code qui fait confiance au timing sera seul en production.


🌐 5ïžâƒŁ CORS : ange en local, dĂ©mon en prod 😈

🎭 L’histoire

L’API fonctionne en local.
En production, le navigateur hurle :

Blocked by CORS policy

😇 Local

  • Proxy activĂ©
  • Navigateur tolĂ©rant
  • La vie est belle 🌈

đŸ˜± Production

  • Vrai domaine
  • Vraie sĂ©curitĂ©
  • Vraies rĂšgles

❌ Configuration serveur manquante

✅ Solution Express

import cors from "cors";

app.use(cors({
  origin: "https://yourdomain.com",
  methods: ["GET", "POST"]
}));

🧠 Astuce

  • Ouvrir CORS avec * = laisser la porte grande ouverte
  • Ne fais jamais ça au hasard en production

đŸ”„ 6ïžâƒŁ Le mensonge du console.log

« Mais je l’ai vu en local
 »

❌ Habitude locale

console.log("User:", user);

😇 Local

  • Terminal ouvert
  • Sous tes yeux

😈 Production

  • Logs ailleurs
  • Ou pas collectĂ©s
  • Ou personne ne les regarde

✅ Vrai logging

logger.info("User loaded", {
  userId: user.id,
  role: user.role
});

🧠 Pourquoi c’est important ?

  • L’historique des erreurs est conservĂ©
  • Le debug devient possible
  • Le stress diminue 😌

🧠 console.log = roue de vĂ©lo

Production = voiture 🚗


🧹 7ïžâƒŁ L’anatomie de « Ça marche chez moi »

Cette phrase ne signifie pas :

  • Que le code est correct
  • Que le systĂšme est solide

Elle signifie en réalité :

  • Que les environnements sont diffĂ©rents

Local ≠ Production parce que :

  • L’OS est diffĂ©rent
  • La version de Node est diffĂ©rente
  • Le trafic est diffĂ©rent
  • La sĂ©curitĂ© est diffĂ©rente
  • Les utilisateurs sont impatients 😅

✅ Checklist salvatrice avant la production

  • Toutes les variables .env sont-elles prĂ©sentes ?
  • Les versions de Node sont-elles identiques ?
  • La sensibilitĂ© Ă  la casse Linux a-t-elle Ă©tĂ© testĂ©e ?
  • Un vrai systĂšme de logs est-il en place ?
  • La gestion des erreurs est-elle implĂ©mentĂ©e ?
  • Quelqu’un a-t-il dit « ça marche chez moi » ?

🎬 Grande mĂ©taphore de conclusion

  • Local : scĂšne de rĂ©pĂ©tition 🎭
  • Production : diffusion en direct đŸ“ș

Tu peux faire des erreurs pendant les répétitions.
Mais en direct
 tout le monde regarde 😄


🏁 Mot de la fin

La production demande une chose :

« Écris-moi pour le pire des scĂ©narios. »

Le local, lui, dit :

« Je peux gérer. »

Et souviens-toi :

Le vĂ©ritable examen de ton code, c’est la production.
Le local n’est que la bande-annonce đŸŽžïž

Comments

No comments yet. Why don’t you start the discussion?

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile ißaretlenmißlerdir