Best Studio 1
Best Studio
TuZaKK 1
TuZaKK
Mt2Hizmet 1
Mt2Hizmet
Agora Metin2 1
Agora Metin2
Bvural41 1
Bvural41
kaptanmikro1 1
kaptanmikro1
R 1
Roksam
[DEV]AB 1
[DEV]AB
Sevdamsın 1
Sevdamsın
farkmt2official 1
farkmt2official
emirhanHCL 1
emirhanHCL
Hikaye Ekle

[NODE JS] Express Router ile Route Düzenleme

  • Konuyu başlatan Konuyu başlatan Silverhand
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 1
  • Görüntüleme Görüntüleme 12

Türkiye'de ilk Mobil & PC Aynı Anda Metin2 Oyna. Triarchonline kalıcı ve uzun ömürlü yapısı ile 24 Temmuz'da açılıyor. | 1-99 Mobil Metin2 Triarch HEMEN TIKLA!

nodejs.png


[NODE JS] Express Router ile Route Düzenleme​


Proje büyüdükçe tüm route'ları tek bir dosyada tutmak sürdürülemez hale gelir. Express Router bu sorunu çözmek için tasarlanmış bir mini uygulama sistemidir. Router ile route'larınızı modüler dosyalara ayırabilir, her dosyanın kendi middleware'lerini tanımlayabilir ve bunları ana uygulamaya bağlayabilirsiniz.

express.Router() çağrısı size bir router instance döner. Bu instance tıpkı app gibi get, post, put, delete gibi metodları destekler. Router'ı bir dosyada tanımlayıp module.exports ile dışa aktarırsınız, sonra ana dosyada app.use() ile bağlarsınız. Mesela userRouter'ı app.use('/api/users', userRouter) ile bağladığınızda router içindeki tüm route'lar /api/users prefix'i ile erişilebilir olur.

Ben büyük bir e-ticaret projesinde çalışırken tüm route'lar tek dosyadaydı ve dosya 2000 satırı aşmıştı. Herhangi bir değişiklik yapmak kabus gibiydi, merge conflict'ler sürekli çıkıyordu. Router yapısına geçtikten sonra her modül kendi dosyasında oldu ve ekip çalışması çok rahatladı. Her geliştirici kendi modülünde çalışabiliyordu.

Router seviyesinde middleware tanımlayabilirsiniz. router.use() ile eklediğiniz middleware sadece o router'ın route'larında çalışır. Bu sayede admin route'larına auth middleware ekleyip public route'ları açık bırakabilirsiniz. Bu izolasyon proje düzenini çok iyileştirir.

Router'lar iç içe de kullanılabilir. Bir router başka bir router'ı alt route olarak bağlayabilir. Mesela apiRouter altında usersRouter ve productsRouter olabilir. Bu hiyerarşik yapı büyük projelerde çok kullanışlıdır.

Klasör yapısı olarak genellikle routes/ veya routers/ adında bir klasör açılır ve her kaynak için ayrı bir dosya oluşturulur: users.js, products.js, orders.js gibi. Controller pattern'i ile birlikte kullanıldığında route dosyaları çok kısa ve okunabilir olur. Route dosyası sadece yönlendirme yapar, iş mantığı controller'da olur.

Router.param() metodu da tıpkı app.param() gibi çalışır ama sadece o router'ın route'larında geçerlidir. Spesifik bir router için parametre middleware tanımlamak istediğinizde kullanışlıdır.

Versiyonlama da Router ile çok kolay yapılır. /api/v1/ ve /api/v2/ için ayrı router'lar oluşturup farklı versiyonları aynı anda çalıştırabilirsiniz. Eski versiyonu deprecated olarak işaretleyip yeni versiyona geçişi kademeli yapabilirsiniz.

Route dosyalarını otomatik yükleme de yapabilirsiniz. routes/ klasöründeki tüm dosyaları okuyup otomatik olarak bağlayan bir script yazabilirsiniz. Bu sayede yeni bir route dosyası eklediğinizde ana dosyayı değiştirmenize gerek kalmaz. Ama bu yaklaşım debugging'i zorlaştırabilir, dikkatli kullanın.

JavaScript:
// ===== PROJE YAPISI =====
// project/
//   app.js
//   routes/
//     index.js
//     users.js
//     products.js
//     orders.js
//   controllers/
//     userController.js
//     productController.js

// ===== routes/users.js =====
const express = require('express');
const router = express.Router();

// Bu router'a ozel middleware
router.use((req, res, next) => {{
  console.log(`[Users Router] ${{req.method}} ${{req.url}}`);
  next();
}});

// Ornek kullanici verisi
let kullanicilar = [
  {{ id: 1, ad: 'Ahmet Yilmaz', email: 'ahmet@test.com', rol: 'admin' }},
  {{ id: 2, ad: 'Zeynep Kaya', email: 'zeynep@test.com', rol: 'user' }},
  {{ id: 3, ad: 'Mehmet Demir', email: 'mehmet@test.com', rol: 'editor' }},
];

// Parametre middleware - id dogrulama
router.param('id', (req, res, next, id) => {{
  const numId = parseInt(id, 10);
  if (isNaN(numId) || numId <= 0) {{
    return res.status(400).json({{ hata: 'Gecersiz kullanici ID' }});
  }}
  const kullanici = kullanicilar.find(k => k.id === numId);
  if (!kullanici) {{
    return res.status(404).json({{ hata: 'Kullanici bulunamadi' }});
  }}
  req.hedefKullanici = kullanici;
  next();
}});

// GET /api/users
router.get('/', (req, res) => {{
  res.json({{ toplam: kullanicilar.length, kullanicilar }});
}});

// GET /api/users/:id
router.get('/:id', (req, res) => {{
  res.json(req.hedefKullanici);
}});

// POST /api/users
router.post('/', (req, res) => {{
  const {{ ad, email, rol }} = req.body;
  if (!ad || !email) {{
    return res.status(400).json({{ hata: 'Ad ve email zorunludur' }});
  }}
  const yeni = {{ id: kullanicilar.length + 1, ad, email, rol: rol || 'user' }};
  kullanicilar.push(yeni);
  res.status(201).json(yeni);
}});

// PUT /api/users/:id
router.put('/:id', (req, res) => {{
  Object.assign(req.hedefKullanici, req.body);
  res.json(req.hedefKullanici);
}});

// DELETE /api/users/:id
router.delete('/:id', (req, res) => {{
  kullanicilar = kullanicilar.filter(k => k.id !== req.hedefKullanici.id);
  res.json({{ mesaj: 'Kullanici silindi' }});
}});

// ===== routes/products.js =====
// (Ayni dosyada gosteriyorum ama normalde ayri dosyada olur)

const productRouter = express.Router();

let urunler = [
  {{ id: 1, ad: 'Laptop', fiyat: 25000, kategori: 'elektronik' }},
  {{ id: 2, ad: 'Kitap', fiyat: 120, kategori: 'kitap' }},
  {{ id: 3, ad: 'Tisort', fiyat: 350, kategori: 'giyim' }},
];

productRouter.get('/', (req, res) => {{
  let sonuc = [...urunler];
  if (req.query.kategori) {{
    sonuc = sonuc.filter(u => u.kategori === req.query.kategori);
  }}
  if (req.query.minFiyat) {{
    sonuc = sonuc.filter(u => u.fiyat >= Number(req.query.minFiyat));
  }}
  res.json({{ toplam: sonuc.length, urunler: sonuc }});
}});

productRouter.get('/:id', (req, res) => {{
  const urun = urunler.find(u => u.id === parseInt(req.params.id));
  if (!urun) return res.status(404).json({{ hata: 'Urun bulunamadi' }});
  res.json(urun);
}});

productRouter.post('/', (req, res) => {{
  const yeni = {{ id: urunler.length + 1, ...req.body }};
  urunler.push(yeni);
  res.status(201).json(yeni);
}});

// ===== app.js - Ana dosya =====

const app = express();
app.use(express.json());

// Genel middleware
app.use((req, res, next) => {{
  req.requestTime = new Date().toISOString();
  next();
}});

// Router'lari bagla
app.use('/api/users', router);           // users route'lari
app.use('/api/products', productRouter); // product route'lari

// Versiyon ornegi
const v2Router = express.Router();
v2Router.get('/users', (req, res) => {{
  res.json({{ version: 'v2', mesaj: 'Yeni versiyon API' }});
}});
app.use('/api/v2', v2Router);

// Ana sayfa
app.get('/', (req, res) => {{
  res.json({{
    api: 'Express Router Ornegi',
    endpoints: {{
      kullanicilar: '/api/users',
      urunler: '/api/products',
      v2: '/api/v2/users',
    }},
  }});
}});

// 404 handler
app.use((req, res) => {{
  res.status(404).json({{ hata: 'Endpoint bulunamadi' }});
}});

// Error handler
app.use((err, req, res, next) => {{
  console.error(err.stack);
  res.status(500).json({{ hata: 'Sunucu hatasi' }});
}});

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

Router kullanmak sadece kodu düzenlemek değil aynı zamanda test edilebilirliği de artırır. Her router'ı bağımsız olarak test edebilirsiniz. supertest gibi paketlerle router'ı izole test etmek çok kolaydır. Bu da daha güvenilir bir uygulama geliştirmenizi sağlar.
 

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

Benzer konular

  • 5.00 yıldız(lar) 1 Değerlendirme
2 3
Cevaplar
12
Görüntüleme
1K
Geri
Üst