💥 “Çalışıyor ama Production’da Patladı” Hikâyeleri

💥 “Çalışıyor ama Production’da Patladı” Hikâyeleri

Local ≠ Prod gerçeği (Acı, komik ve öğretici)

Bir yazılımcının kariyer yolculuğu şu üç evreden geçer:

  1. Junior: “Çalışıyor 🎉”
  2. Mid: “Edge case olabilir mi 🤔”
  3. Senior: “Production’da ne olur 😐”

Bu yazı seni 2’den 3’e taşıma yazısıdır.
Hem güleceğiz, hem “ah be” diyeceğiz, hem de gerçekten işe yarayan pratikler öğreneceğiz.

Hazırsan başlıyoruz 👇
Kahveni al ☕, production log’larını kapat (şimdilik).


🧪 1️⃣ Environment Variable Sendromu

“Local’de vardı ama prod’da… kim bu?”

🎭 Hikâye

Local ortamda API çağrısı çalışıyor.
Production’a deploy… BOOM 💣
500 Internal Server Error.

❌ Sorunlu Kod

const apiKey = process.env.API_KEY;

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

🧠 Burada Ne Oluyor?

  • Kod API_KEY bekliyor
  • Ama production’da bu değişken tanımlı değil
  • undefined ile API’ye gidiliyor
  • API diyor ki: “Anahtar nerede kardeşim?”

😇 Local Neden Çalıştı?

Çünkü .env dosyası vardı:

API_KEY=super-secret-key

Production:

  • .env yok
  • Ya da yanlış yerde
  • Ya da yanlış isimde

✅ Sağlam Çözüm

const apiKey = process.env.API_KEY;

if (!apiKey) {
  throw new Error("API_KEY tanımlı değil! Production ağlıyor 😭");
}

🛠️ Pratik İpucu

  • Uygulama ayağa kalkarken env kontrolü yap
  • Runtime’da patlamasın

🧠 Altın Kural:

“Eksik env ile çalışan uygulama, saatli bombadır.”


📁 2️⃣ Dosya Yolu Faciası

Windows hoşgörülü, Linux acımasızdır

🎭 Hikâye

Local Windows.
Prod Linux.
Dosya bulunamıyor…

❌ Yanlış Kod

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

😇 Local

Windows:

“Sorun değil, ben anladım.”

😈 Production

Linux:

“Backslash mı? Yanlış evrendesin.” ❌

✅ Doğru Yaklaşım

import path from "path";

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

🧠 Burada Ne Kazandık?

  • İşletim sistemi farkını unuttuk
  • Kod taşınabilir oldu
  • Bir bug daha mezara 🪦

🧠 Altın Kural:

Dosya yolu elle yazılmaz, path ile yapılır.


🔠 3️⃣ Case Sensitivity (Harf Hassasiyeti)

Local affeder, prod asla

🎭 Hikâye

Deploy sonrası:

Cannot find module './services/userService'

❌ Kod

import UserService from "./services/userService";

📁 Dosya Gerçekte:

UserService.js

😇 Local (Mac / Windows)

“Ben senin ne demek istediğini anladım.”

😈 Production (Linux)

“Hayır. Harf hatası var. Bye.” 👋

✅ Çözüm

  • Dosya adları net
  • Import’lar birebir
  • Otomatik lint kullan
import UserService from "./services/UserService";

🧠 Production Linux’tur.
Bunu kabul edince hayat kolaylaşır.


⏱️ 4️⃣ Timing ve Async Yanılsaması

“Local hızlıydı…”

❌ Tehlikeli Kod

let user;

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

console.log(user.name);

😇 Local

  • CPU boş
  • Event loop hızlı
  • Şans senden yana 🎲

😈 Production

  • Trafik var
  • Sunucu dolu
  • user hâlâ undefined 💥

✅ Doğru Mantık

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

🧠 Ne Öğrendik?

  • Async kodda sıraya güvenme
  • Scope’a güven
  • Callback / async-await kullan

🧠 Altın Kural:

Timing’e güvenen kod, production’da yalnız kalır.


🌐 5️⃣ CORS: Local’de Melek, Prod’da Şeytan 😈

🎭 Hikâye

Local’de API çalışıyor.
Prod’da tarayıcı bağırıyor:

Blocked by CORS policy

😇 Local

  • Proxy açık
  • Tarayıcı toleranslı
  • Hayat güzel 🌈

😱 Production

  • Gerçek domain
  • Gerçek güvenlik
  • Gerçek kurallar

❌ Eksik Sunucu Ayarı

✅ Express Çözümü

import cors from "cors";

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

🧠 İpucu

  • * ile CORS açmak = “Kapıyı açık bırakmak”
  • Prod’da asla rastgele açma

🔥 6️⃣ console.log Yalanı

“Local’de gördüm ya…”

❌ Local Alışkanlığı

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

😇 Local

  • Terminal açık
  • Gözünün önünde

😈 Production

  • Log başka yerde
  • Ya da hiç yok
  • Ya da kimse bakmıyor

✅ Gerçek Logging

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

🧠 Neden Önemli?

  • Hata geçmişi tutulur
  • Debug yapılır
  • Panic azalır 😌

🧠 console.log = bisiklet tekerleği
Production = araba 🚗


🧨 7️⃣ “Bende Çalışıyor” Cümlesinin Anatomisi

Bu cümle şunları söylemez:

  • Kod doğru
  • Sistem sağlam

Şunu söyler:

  • Ortamlar farklı

Local ≠ Production çünkü:

  • OS farklı
  • Node versiyonu farklı
  • Trafik farklı
  • Güvenlik farklı
  • Kullanıcı sabırsız 😅

✅ Production Öncesi Hayat Kurtaran Checklist

  • .env eksiksiz mi?
  • Node sürümleri aynı mı?
  • Linux case test edildi mi?
  • Logging var mı?
  • Error handling var mı?
  • “Bende çalışıyor” cümlesi kurulmadı mı?

🎬 Büyük Benzetme ile Kapanış

  • Local: prova sahnesi 🎭
  • Production: canlı yayın 📺

Prova sırasında hata yapabilirsin.
Ama canlı yayında… herkes izliyor 😄


🏁 Son Söz

Production şunu ister:

“Beni en kötü senaryoya göre yaz.”

Local ise şunu der:

“Ben idare ederim.”

Ve unutma:

Kodun gerçek sınavı production’dır.
Local sadece fragman 🎞️

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