🛣️ C2 · Route Tanımı: app.get/post, req.params/query

C2 · Route Tanımı: app.get/post: Bir Express route'u, otelde **oda numarası ve resepsiyon talimatı** gibidir: `app.get('/api/v1/bugs/:id', ...)` yazdığında `:id` kısmı değişken b

Bir Express route'u, otelde **oda numarası ve resepsiyon talimatı** gibidir: `app.get('/api/v1/bugs/:id', ...)` yazdığında `:id` kısmı değişken bir "oda numarası" (path parameter), `?status=OPEN` gibi bir sorgu ise resepsiyona bırakılan bir "not" (query parameter) — biri **yolun kendisinin bir parçası**, diğeri **isteğe bağlı bir ek bilgi**dir. Spring'de bu ikisi `@PathVariable` ve `@RequestParam` annotation'larıyla imzada açıkça görünür; Express'te ise `req.params.id` ve `req.query.status` ile fonksiyon gövdesinde elle okunur — annotation yerine sözleşme, fonksiyonun İÇİNDE yaşar. Peki neden bazı bilgi yola (`/bugs/42`), bazısı sorguya (`?status=OPEN`) konur? Çünkü yol bir **kaynağın kimliğini** taşır (42 numaralı bug olmadan bu request anlamsızdır), sorgu ise bir **filtreleme/isteğe bağlı davranışı** taşır (status olmadan da liste request'i geçerlidir). Tester için bunun anlamı: `req.params` HER ZAMAN string gelir — JavaScript'in tip sistemi zayıf olduğundan `"1" === 1` FALSE'tur; bu, ID karşılaştırmalarında sinsi bir hata kaynağıdır ve az sonra göreceğin gibi gerçek bir defect doğurur.

Liste, Filtre ve Tek Kayıt

**🐞 Defect Doğum Anı — `req.params.id` tip dönüşümü unutulursa** **Kod:** `bugs.find(b => b.id === req.params.id)` — `b.id` bir **number** (1, 2, ...), `req.params.id` her zaman bir **string** (`"1"`, `"2"`, ...). **Ne olur:** `GET /api/v1/bugs/1` request'i gönderilir, kayıt VERİTABANINDA vardır, ama `1 === "1"` JavaScript'te `false` olduğu için `find` hiçbir zaman eşleşme bulamaz — sonuç her zaman 404'tür, kayıt var olsa bile. **Neden sinsi:** Kod okunduğunda mantık tamamen doğru görünür ("id'leri karşılaştırıyoruz"). Hata bir syntax veya runtime exception değil, sessiz bir mantık hatasıdır — sadece testerin "bu ID kesinlikle var, neden 404 alıyorum?" diye şaşırmasıyla ortaya çıkar. **Tester nerede yakalar:** Var olduğu bilinen bir ID ile GET request'i atıp 200 yerine 404 alınca — bu, JS'in zayıf tipleme tuzağının klasik bir örneğidir; düzeltme `Number(req.params.id)` ile tip dönüşümü yapmaktır.

🎬 "1" ≠ 1: Path Parameter Neden Her Zaman String Gelir?

İstemci `/api/v1/bugs/1` request'i gönderiyor — URL her zaman metin karakterlerinden oluşur.

Express, `:id` kısmını `req.params.id` içine STRING olarak koyar: `"1"`, sayı değil.

Ama bellekteki bug kaydının `id` alanı bir NUMBER'dır: `1`.

JavaScript'te `===` tip dönüşümü YAPMAZ: `"1" === 1` her zaman `false`'tur.

Ders — `find` hiç eşleşme bulamaz, kayıt var olsa bile 404 döner. Tester `Number(req.params.id)` dönüşümünün yapıldığını doğrulamalıdır.

req.params vs req.query: Kim Nereden Gelir?

/bugs/:id kalıbındaki :id, req.params.id olarak STRING gelir.

?status=OPEN&page=1 gibi ekler req.query nesnesine STRING olarak konur.

Sayısal karşılaştırma öncesi Number(...) ile dönüştür, aksi halde === her zaman false döner.

Tek bir bug kaydını ID ile getirme akışını sırala.