🛡️ C4 · Validation: express-validator / zod

C4 · Validation: express-validator / zod: Express'te validation, **kapıdaki güvenlik görevlisini işe alıp eğitmek** gibidir: Spring'de `@Valid` + `@NotBlank` yazdığında güvenlik

Express'te validation, **kapıdaki güvenlik görevlisini işe alıp eğitmek** gibidir: Spring'de `@Valid` + `@NotBlank` yazdığında güvenlik zaten binanın bir parçasıdır (framework hallediyor); Express'te önce bir güvenlik firması seçersin (`express-validator` veya `zod`), sonra ona hangi kuralları uygulayacağını TEK TEK öğretirsin (`body('title').isLength({min:3, max:120})`). Peki JavaScript'in kendi tip sistemi zaten yokken (hatta TypeScript bile derleme zamanı korur, çalışma zamanında değil), neden ayrı bir kütüphane şart? Çünkü `req.body` HTTP üzerinden gelen ham JSON'dur — tarayıcı konsolunda `typeof` yazsan bile "object" görürsün, ama içindeki `title` alanının GERÇEKTEN 3-120 karakter bir string olduğunu hiçbir derleyici garanti etmez; bunu ancak çalışma zamanında AÇIKÇA kontrol eden bir kütüphane garanti edebilir. Java'da Bean Validation (`@NotBlank`, `@Size`) sınıf alanına "yapışık" dururken, Express'te validation bir "muhafız" olarak route'un ÖNÜNE (middleware olarak) konur — mantık aynı (sözleşmeyi ÇALIŞMA ZAMANINDA doğrula), sözdizimi farklı. Tester için sonuç yine aynı: doğrulama kuralları tanımlanmış GÖRÜNSE bile, sonucu OKUYAN bir kod satırı yoksa kurallar hiçbir işe yaramaz — az sonra bunu göreceksin.

Kuralları Tanımlamak ve SONUCU Okumak

**🐞 Defect Doğum Anı — `validationResult(req)` kontrolü unutulursa** **Kod:** `body('title').isLength(...)` kuralları TANIMLANDI, ama handler içinde `validationResult(req)` çağrısı ve `if (!errors.isEmpty())` kontrolü YOK. **Ne olur:** `express-validator` kuralları arka planda ÇALIŞIR ve hataları biriktirir, ama hiç kimse bu sonucu OKUMADIĞI için hatalar sessizce göz ardı edilir. `POST /api/v1/bugs { "title": "" }` request'i 400 yerine 201 döner ve boş başlıklı bug kaydedilir. **Neden sinsi:** Kod incelendiğinde validation kuralları GERÇEKTEN oradadır — bir code review'da "validation var" denip geçilebilir. Ama kural TANIMLAMAK ile kuralın SONUCUNU okumak iki ayrı adımdır; ilkini yapıp ikincisini unutmak, Spring'deki `starter-validation` eksikliğinden (B1) FARKLI bir kök nedenle AYNI sonucu (sessiz 201) doğurur. **Tester nerede yakalar:** Geçersiz veriyle (boş title, geçersiz e-posta) negatif test atıp 201 alınca — "kural var ama okunmuyor" defect ailesinin Express'teki karşılığı budur.

🎬 Kural Var, Ama Kimse Okumuyor

body(...).isLength(...)

Kurallar arka planda çalışır

errors nesnesi doldu

Boş title ile 201 aldı

Geliştirici `body('title').isLength({min:3,max:120})` kuralını yazıyor — kural TANIMLANDI.

Request geldiğinde bu kural gerçekten ÇALIŞIR ve `title` alanını kontrol eder.

Boş `title` kuralı ihlal eder, `errors` nesnesi hata bilgisiyle dolar.

Ama handler `validationResult(req)` çağırmıyor — dolu `errors` nesnesi HİÇ okunmuyor, sessizce yok sayılıyor.

Ders — Kural tanımlamak yetmez, SONUCU okuyup handler'ı erken sonlandırmak (return) şarttır. Tester her zaman "kural var mı" değil, "kural gerçekten UYGULANIYOR mu" diye sorar.

Kural Tanımlamaktan Reddetmeye