kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
farkmt2official 1
farkmt2official
mannaxxx 1
mannaxxx
Bvural41 1
Bvural41
Agora Metin2 1
Agora Metin2
berkmenoo 1
berkmenoo
Hikaye Ekle

[NODE JS] Express ile Route Tanımlama

nodejs.png


[NODE JS] Express ile Route Tanımlama​


Express'te route tanımlama, web uygulamanızın omurgasını oluşturur. Her route bir URL pattern'i ile bir HTTP metodunun birleşimidir ve bu birleşime karşılık gelen bir handler fonksiyonu çalıştırır. Route'lar sayesinde uygulamanız farklı URL'lere gelen istekleri farklı şekillerde işleyebilir.

Express'te route tanımlamak çok sezgisel. app.get('/users', handler) dediğinizde GET /users isteğini yakalarsınız. app.post('/users', handler) ile POST /users isteğini yakalarsınız. Her HTTP metodu için ayrı bir metod var: get, post, put, delete, patch, options, head. Ayrıca app.all() tüm HTTP metodlarını yakalayan bir route tanımlar.

Route tanımlarken sıralama çok önemli. Express route'ları yukarıdan aşağıya doğru kontrol eder ve ilk eşleşen route'u çalıştırır. Bu yüzden daha spesifik route'ları önce, daha genel olanları sonra tanımlamalısınız. Mesela /users/profile route'unu /users/:id route'undan önce tanımlamalısınız. Aksi halde profile kelimesi bir id olarak algılanır.

Ben bu sıralama hatasını birçok kez yaptım ve debug etmesi gerçekten sinir bozucu olabiliyor. Bir seferinde /api/products/featured endpoint'i çalışmıyordu çünkü üstünde /api/products/:id tanımlıydı. Featured kelimesi id parametresi olarak yakalanıyordu. Route'ları yeniden sıraladığımda sorun çözüldü.

Express route'larında path string'leri aslında regex pattern'lerine çevrilir. Bazı özel karakterler kullanabilirsiniz: soru işareti (?) önceki karakteri opsiyonel yapar, artı (+) önceki karakteri bir veya daha fazla kez tekrar ettirir, yıldız (*) herhangi bir karakter dizisiyle eşleşir. Bu özellikler basit pattern matching yapmanızı sağlar.

Ayrıca route path'ine düzenli ifade (regex) de verebilirsiniz. app.get(/.*fly$/, handler) gibi bir tanım fly ile biten tüm URL'leri yakalar: butterfly, dragonfly gibi. Bu çok güçlü bir özellik ama okunabilirlik açısından dikkatli kullanmak gerekiyor.

Birden fazla handler fonksiyonu da tanımlayabilirsiniz. Bu aslında inline middleware kullanmak gibidir. İlk handler bir kontrol yapar, uygunsa next() ile sonraki handler'a geçer. Bu pattern authentication ve authorization kontrollerinde çok kullanışlıdır.

app.route() metodu aynı path için farklı HTTP metodlarını zincirleme tanımlamanızı sağlar. Mesela /users path'i için GET, POST, PUT işlemlerini tek bir zincirde tanımlayabilirsiniz. Bu kod tekrarını azaltır ve ilgili route'ları bir arada tutar.

Route gruplandırma Express'te doğrudan desteklenmez ama Router ile bu işi yapabilirsiniz. Router konusunu ayrı bir yazıda detaylıca ele alacağız ama kısaca şunu söyleyeyim: express.Router() ile mini uygulamalar oluşturup bunları ana uygulamaya bağlayabilirsiniz. Bu sayede route'larınızı modüler hale getirirsiniz.

Express 5 ile birlikte route tanımlamada bazı değişiklikler geliyor. Regex tipi path'ler için yeni bir syntax gelecek ve path-to-regexp kütüphanesinin yeni versiyonu kullanılacak. Ama şu an için Express 4 syntax'ını öğrenmeniz yeterli çünkü piyasadaki projelerin büyük çoğunluğu Express 4 kullanıyor.

JavaScript:
const express = require('express');
const app = express();

app.use(express.json());

// ===== TEMEL ROUTE TANIMLAMA =====

// GET istegi - veri getirme
app.get('/', (req, res) => {{
  res.json({{ mesaj: 'Ana sayfa', metod: 'GET' }});
}});

// POST istegi - veri olusturma
app.post('/api/mesajlar', (req, res) => {{
  const {{ gonderen, icerik }} = req.body;
  res.status(201).json({{
    id: Date.now(),
    gonderen,
    icerik,
    tarih: new Date().toISOString(),
  }});
}});

// PUT istegi - veri guncelleme (tum kaydi degistirir)
app.put('/api/mesajlar/:id', (req, res) => {{
  res.json({{
    mesaj: `Mesaj ${{req.params.id}} guncellendi`,
    yeniVeri: req.body,
  }});
}});

// PATCH istegi - kismi guncelleme
app.patch('/api/mesajlar/:id', (req, res) => {{
  res.json({{
    mesaj: `Mesaj ${{req.params.id}} kismi guncellendi`,
    degisiklikler: req.body,
  }});
}});

// DELETE istegi - veri silme
app.delete('/api/mesajlar/:id', (req, res) => {{
  res.json({{ mesaj: `Mesaj ${{req.params.id}} silindi` }});
}});

// ===== OZEL PATH PATTERNLERI =====

// ? isareti: onceki karakter opsiyonel
// /renk ve /renkl ikisi de eslesir
app.get('/renk?l', (req, res) => {{
  res.json({{ route: 'opsiyonel karakter', url: req.url }});
}});

// + isareti: onceki karakter 1 veya daha fazla
// /buzzzz eslesir ama /bu eslesmez
app.get('/bu+z', (req, res) => {{
  res.json({{ route: 'tekrar eden karakter', url: req.url }});
}});

// * isareti: herhangi bir karakter dizisi
// /api/herhangi/bir/sey eslesir
app.get('/api/docs/*', (req, res) => {{
  res.json({{ route: 'wildcard', url: req.url }});
}});

// ===== SIRALAMA ONEMI =====

// Bu ONCE tanimlanmali - spesifik route
app.get('/kullanicilar/profil', (req, res) => {{
  res.json({{ sayfa: 'Profil sayfasi' }});
}});

app.get('/kullanicilar/ayarlar', (req, res) => {{
  res.json({{ sayfa: 'Ayarlar sayfasi' }});
}});

// Bu SONRA tanimlanmali - dinamik parametre
app.get('/kullanicilar/:id', (req, res) => {{
  res.json({{ kullaniciId: req.params.id }});
}});

// ===== BIRDEN FAZLA HANDLER =====

// Middleware benzeri kontrol
function authKontrol(req, res, next) {{
  const token = req.headers.authorization;
  if (!token) {{
    return res.status(401).json({{ hata: 'Yetkilendirme gerekli' }});
  }}
  req.kullanici = {{ id: 1, ad: 'Test Kullanici' }};
  next();
}}

function adminKontrol(req, res, next) {{
  if (req.kullanici.id !== 1) {{
    return res.status(403).json({{ hata: 'Admin yetkisi gerekli' }});
  }}
  next();
}}

app.get('/admin/panel', authKontrol, adminKontrol, (req, res) => {{
  res.json({{ mesaj: 'Admin paneline hosgeldiniz', kullanici: req.kullanici }});
}});

// ===== app.route() ile ZINCIRLEME =====

app.route('/api/kitaplar')
  .get((req, res) => {{
    res.json({{ islem: 'Tum kitaplari listele' }});
  }})
  .post((req, res) => {{
    res.status(201).json({{ islem: 'Yeni kitap eklendi', veri: req.body }});
  }});

app.route('/api/kitaplar/:id')
  .get((req, res) => {{
    res.json({{ islem: `Kitap ${{req.params.id}} detayi` }});
  }})
  .put((req, res) => {{
    res.json({{ islem: `Kitap ${{req.params.id}} guncellendi` }});
  }})
  .delete((req, res) => {{
    res.json({{ islem: `Kitap ${{req.params.id}} silindi` }});
  }});

// ===== ALL METODU =====
// Tum HTTP metodlariyla eslesir
app.all('/api/test', (req, res) => {{
  res.json({{ metod: req.method, url: req.url }});
}});

app.listen(3000, () => {{
  console.log('Route ornekleri sunucusu port 3000\'de');
}});

Route tanımlamada en önemli kural tutarlılıktır. RESTful convention'lara uyun: noun'lar kullanın (verb değil), çoğul isimler tercih edin (/users, /products), hiyerarşiyi URL'de yansıtın (/users/5/orders gibi). Bu konuyu REST API tasarımı yazısında çok daha detaylı işleyeceğiz.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst