🚨 C5 · Error Handling Middleware: (err, req, res, next)
C5 · Error Handling Middleware: (err: Express'in hata yakalayan middleware'i, **binadaki tek bir yangın çıkışı** gibidir: normal middleware'ler 3 parametre alır (`req, res, next`
Express'in hata yakalayan middleware'i, **binadaki tek bir yangın çıkışı** gibidir: normal middleware'ler 3 parametre alır (`req, res, next`), ama Express'e "ben bir hata yakalayıcıyım" demenin TEK yolu tam olarak **4 parametre** almaktır (`err, req, res, next`) — bu bir kural değil, Express'in kodunu okuyup parametre SAYISINA bakarak ayrım yapmasıdır (`fn.length === 4`). Route içinde `next(err)` çağırdığında, Express normal zinciri bırakır ve bir sonraki 4-parametreli middleware'i arar. Spring'de bunun karşılığı `@RestControllerAdvice` + `@ExceptionHandler`'dır — orada exception TİPİNE göre eşleştirme annotation ile yapılır, Express'te ise TEK bir catch-all middleware'e her hata `next(err)` ile elle yönlendirilir. Peki neden Express bunu bu kadar "gizli" bir kuralla (parametre sayısı) yapıyor? Çünkü framework'ün kendisi minimal — ayrı bir "hata sınıfı" kavramı dayatmaz, senin JavaScript'in kendi mekanizmalarını (fonksiyon imzası) kullanmanı bekler. Tester için kritik nokta: bu middleware'in KAYIT SIRASI da C3'teki gibi kritiktir — route'lardan ÖNCE tanımlanırsa Express ona hiçbir zaman ulaşamaz, çünkü henüz hiçbir hata `next(err)` ile fırlatılmamışken sırada değildir.
4 Parametreli "Gizli" İmza
**🐞 Defect Doğum Anı — hata yakalayıcı middleware route'lardan ÖNCE tanımlanırsa** **Kod:** 4 parametreli `(err, req, res, next)` middleware'i dosyanın EN ÜSTÜNE, route tanımlarından önce konmuş. **Ne olur:** `GET /api/v1/bugs/999` (var olmayan id) request'i atılır; route içinde `next({status:404, ...})` çağrılır ama Express, kayıt SIRASINDA bu noktadan SONRA gelen bir hata middleware'i arar — geriye doğru bakmaz. Hiçbiri bulunamadığı için Express kendi VARSAYILAN hata sayfasını (HTML, stack trace içeren) döner. **Neden sinsi:** Geliştirici "hata yakalayıcımı yazdım" der ve code review'dan geçer — kod GERÇEKTEN doğru yazılmıştır, sadece dosyadaki KONUMU yanlıştır. Sonuç, beklenen `{"error": "Bug bulunamadi"}` JSON'u yerine HTML bir hata sayfasıdır. **Tester nerede yakalar:** Otomasyon `response.json()` ile gövdeyi ayrıştırmaya çalıştığında `SyntaxError: Unexpected token '<'` alınca — HTML'i JSON sanıp parse etmeye çalışmak, bu hata sınıfının imzasıdır (bkz. GRUP J).
🎬 4 Parametrenin Sihri: Express Bir Hata Yakalayıcıyı Nasıl Tanır?
Express: 4-param arıyor
Bulunamadı: HTML sayfa
Route handler var olmayan bir bug için `next({status:404, ...})` çağırıyor — hatayı zincire devrediyor.
Express, kayıt sırasında BU NOKTADAN SONRA gelen, tam olarak 4 parametre alan bir middleware arar.
DOĞRU SIRADA: hata yakalayıcı route'lardan SONRA tanımlıysa bulunur — düzgün JSON hata gövdesi döner.
YANLIŞ SIRADA: hata yakalayıcı route'lardan ÖNCE tanımlıysa Express onu asla ARAMAZ — kendi varsayılan HTML sayfasına düşer.
Ders — Otomasyon `response.json()` çağırdığında HTML'i ayrıştırmaya çalışır ve çöker. Tester için bu, "kayıt sırası hatası"nın en somut kanıtıdır.
next(err)'ten JSON Hata Gövdesine
Route hatayı devret…
Bulunamama/yetkisiz gibi bir durumda next(err) ile normal zincirden çıkılır.