⛓️ C3 · Middleware Zinciri: express.json(), sıra
C3 · Middleware Zinciri: express.json(): Middleware zinciri, bir **havalimanı güvenlik koridoru** gibidir: yolcu (request) sırayla check-in, bagaj taraması, pasaport kontrolü kon
Middleware zinciri, bir **havalimanı güvenlik koridoru** gibidir: yolcu (request) sırayla check-in, bagaj taraması, pasaport kontrolü kontrol noktalarından geçer; her kontrol noktası (`function(req, res, next)`) yolcuyu inceleyebilir, üzerine bir şey ekleyebilir (bagaj etiketi) veya durdurabilir — ve bir sonraki noktaya SADECE `next()` çağrılırsa geçilir. `express.json()` de tam olarak böyle bir kontrol noktasıdır: gelen JSON gövdesini okuyup `req.body`'ye "etiketler", route handler'a devretmeden önce. Peki Spring'de bu iş neden tek bir `@RequestBody` annotation'ıyla otomatik olurken Express'te ayrı bir adım gerekiyor? Çünkü Spring MVC'nin arkasında hazır bir request işleme hattı (dispatcher servlet) vardır ve gövde ayrıştırma bu hattın standart bir parçasıdır; Express'te böyle bir hat YOKTUR — sen zinciri elle, sırayla kurarsın; en yakın Java karşılığı Servlet **Filter** zinciridir (her filter `chain.doFilter()` çağırana kadar bir sonrakine geçilmez). Tester için kritik nokta: middleware'lerin SIRASI davranışı belirler — `express.json()` route'lardan sonra tanımlanırsa, route'lar asla ayrıştırılmış bir gövde göremez; bu, "kod doğru ama sıra yanlış" kategorisindeki en sinsi hata türüdür.
Zincir Kurmak: Sıra Neden Kritik?
**🐞 Defect Doğum Anı — `express.json()` route'lardan SONRA tanımlanırsa** **Kod:** `app.post('/api/v1/bugs', ...)` önce, `app.use(express.json())` en altta. **Ne olur:** `POST /api/v1/bugs { "title": "...", "severity": "HIGH" }` request'i gönderilir; handler çalıştığında `req.body` HÂLÂ `undefined`'dır çünkü ayrıştırıcı middleware zincirde daha SONRAKI bir noktada. `const { title, severity } = req.body` çökmez (destructuring `undefined`'dan `undefined` üretir), sunucu `201 Created` döner ama `title: undefined, severity: undefined` ile bir kayıt oluşturulur. **Neden sinsi:** Request 201 ile "başarılı" görünür, sunucu çökmez, hata log'u yoktur — ama veritabanında (bellekte) tamamen boş bir bug kaydı oluşur. Kodun KENDİSİ (`express.json()` çağrısı) doğrudur, tek sorun SIRASIDIR. **Tester nerede yakalar:** POST sonrası dönen kaydı GET ile tekrar okuyup `title` alanının `null`/`undefined` geldiğini görünce — bu, "201 aldım ama içerik boş" sınıfındaki en klasik middleware sıralama hatasıdır.
🎬 Middleware Zinciri: Sıra Bozulunca Ne Olur?
Sıra bozuk: req.body = undefined
GET ile kanıt: title boş geldi
İstemci `POST /api/v1/bugs` request'ini `{ "title": "Login donuyor", "severity": "HIGH" }` gövdesiyle gönderiyor.
DOĞRU SIRADA: request önce `express.json()`'a uğrar — ham JSON metni ayrıştırılıp `req.body` nesnesine dönüştürülür.
Sonra logger middleware request'i loglar ve `next()` ile bir sonraki halkaya devreder — zincir kırılmadan devam eder.
Route handler çalışır — `req.body.title` doludur, kayıt doğru oluşur, 201 ve gerçek veri döner.
YANLIŞ SIRADA: `express.json()` route'lardan SONRA tanımlanırsa handler çalıştığında `req.body` HÂLÂ `undefined`'dır.
Sunucu yine de `201 Created` döner — kod çökmez, ama `title: undefined` ile boş bir kayıt oluşur.
Ders — Middleware zincirinde SIRA, koddan bağımsız bir davranış belirleyicidir. Tester "201 aldım" ile yetinmez, dönen/kaydedilen veriyi de doğrular.
Bir POST Request'inin Zincirdeki Yolculuğu