Web uygulamaları geliştirmek, istemciden (tarayıcı, mobil uygulama vb.) gelen istekleri doğru sunucu fonksiyonlarına yönlendirmekle başlar. Bu yönlendirme işlemine modern web mimarisinde routing (yönlendirme) adı verilir. Node.js ekosisteminin en popüler ve kararlı minimal çatısı (framework) olan Express.js, bu süreci son derece esnek, modüler ve performanslı bir şekilde yönetmemizi sağlar.
Bu kapsamlı eğitim rehberinde, Node.js İle Express Üzerinden Routing Nasıl Yapılır? sorusunu tüm yönleriyle ele alacağız. Temel yönlendirme tanımlarından dinamik parametrelere, modüler router yapılarından gelişmiş ara yazılım (middleware) entegrasyonuna kadar her adımı gerçekçi kod örnekleriyle inceleyeceğiz. Hedefimiz, 2026 yılı standartlarına uygun, güvenli, ölçeklenebilir ve temiz bir yönlendirme mimarisi inşa etmektir.
İster ilk Node.js projenizi geliştiriyor olun, ister mevcut Express bilgilerinizi modern pratiklerle güncellemeyi hedefleyin; bu rehberdeki adım adım uygulamalar ve mimari ipuçları, üretim ortamına (production) hazır kodlar yazmanıza yardımcı olacaktır.
Gereksinimler ve Ön Hazırlık
Uygulamamıza başlamadan önce geliştirme ortamımızın güncel ve hazır olduğundan emin olmalıyız. 2026 yılı itibarıyla Node.js LTS (Uzun Süreli Destek) sürümleri, modern JavaScript (ES6+) özelliklerini ve ES modüllerini yerleşik olarak tam performansla desteklemektedir.
- Node.js: Bilgisayarınızda Node.js v20.x veya üzeri bir sürümün kurulu olması önerilir. Terminalinizde
node -vkomutuyla sürümünüzü kontrol edebilirsiniz. - Paket Yöneticisi: Node.js ile birlikte gelen npm (Node Package Manager) veya alternatif olarak yarn / pnpm.
- Kod Editörü: Visual Studio Code veya benzeri bir modern kod editörü.
- Test Aracı: Geliştirdiğimiz API uç noktalarını (endpoints) test etmek için Postman, Thunder Client (VS Code eklentisi) veya terminal üzerinden
curlaracı.
Ortamımız hazırsa, projemiz için yeni bir dizin oluşturup gerekli bağımlılıkları yükleyerek ilk adımımızı atabiliriz.
Adım 1: Proje Kurulumu ve Express Entegrasyonu
İlk olarak projemizin klasör yapısını oluşturacağız ve Express kütüphanesini sistemimize dahil edeceğiz. Modern JavaScript standartlarına (ES Modules) uyum sağlamak için projemizde import/export sözdizimini kullanacağız.
Boş bir terminal açın ve aşağıdaki komutları sırasıyla çalıştırarak projenizi başlatın:
mkdir express-routing-rehberi
cd express-routing-rehberi
npm init -y
Oluşturulan package.json dosyasını açın ve ES modüllerini etkinleştirmek için "type": "module" satırını ekleyin. Ardından Express paketini projenize yükleyin:
npm install express
Şimdi, projemizin kök dizininde app.js adında bir dosya oluşturalım. Bu dosya, Express sunucumuzun başlangıç noktası olacaktır. Aşağıdaki kod bloğu, en temel seviyede bir Express sunucusunu ayağa kaldırır ve kök dizine (/) gelen istekleri karşılar.
import express from 'express';
const app = express();
const PORT = process.env.PORT || 3000;
// JSON verilerini işleyebilmek için Express'in yerleşik ara yazılımını etkinleştiriyoruz
app.use(express.json());
// Temel bir GET rotası tanımlıyoruz
app.get('/', (req, res) => {
res.status(200).json({
success: true,
message: "Express Routing Uygulamasına Hoş Geldiniz!"
});
});
// Sunucuyu belirtilen port üzerinden dinlemeye başlıyoruz
app.listen(PORT, () => {
console.log(`[Sunucu] Sunucu http://localhost:${PORT} adresinde aktif.`);
});
Bu kod bloğunda, express() fonksiyonu ile yeni bir uygulama örneği oluşturduk. app.get() metodu, HTTP GET isteklerini dinlemek için kullanılan en temel yönlendirme fonksiyonudur. req (request - istek) nesnesi istemciden gelen verileri içerirken, res (response - yanıt) nesnesi istemciye göndereceğimiz verileri ve HTTP durum kodlarını yönetmemizi sağlar.
Adım 2: Temel HTTP Metotları ile Routing Nasıl Yapılır?
RESTful API tasarım mimarisinde, kaynaklar üzerinde işlem yapmak için farklı HTTP metotları (fiilleri) kullanılır. Express, tüm standart HTTP metotlarını doğrudan destekleyen fonksiyonlara sahiptir. En sık kullanılan metotlar şunlardır: GET (veri okuma), POST (yeni veri ekleme), PUT (mevcut veriyi güncelleme) ve DELETE (veri silme).
Aşağıdaki örnekte, bellekte (in-memory) geçici bir kullanıcı listesi tutarak, bu dört temel HTTP metodunun Express üzerinde nasıl tanımlandığını adım adım göreceğiz.
import express from 'express';
const app = express();
app.use(express.json());
// Geçici veri kaynağımız (Bellek içi veritabanı simülasyonu)
let kullanicilar = [
{ id: 1, isim: "Ahmet", rol: "Yönetici" },
{ id: 2, isim: "Ayşe", rol: "Yazar" }
];
// 1. GET Metodu: Tüm kullanıcıları listeleme
app.get('/api/kullanicilar', (req, res) => {
res.status(200).json({
success: true,
data: kullanicilar
});
});
// 2. POST Metodu: Yeni kullanıcı ekleme
app.post('/api/kullanicilar', (req, res) => {
const { isim, rol } = req.body;
// Basit girdi doğrulaması (Input Validation)
if (!isim || !rol) {
return res.status(400).json({
success: false,
message: "Lütfen isim ve rol alanlarını doldurun."
});
}
const yeniKullanici = {
id: kullanicilar.length + 1,
isim: isim,
rol: rol
};
kullanicilar.push(yeniKullanici);
res.status(201).json({
success: true,
message: "Kullanıcı başarıyla eklendi.",
data: yeniKullanici
});
});
// Sunucuyu başlatma
app.listen(3000, () => {
console.log("HTTP Metotları Test Sunucusu port 3000 üzerinde çalışıyor.");
});
Yukarıdaki örnekte, app.post() fonksiyonu ile istemciden gelen JSON verisini (req.body) yakaladık. Güvenlik ve veri bütünlüğü açısından, gelen verilerin boş olup olmadığını kontrol eden basit bir doğrulama mekanizması ekledik. Yeni bir kaynak başarıyla oluşturulduğunda HTTP standartlarına uygun olarak 201 Created durum kodunu döndük.
Adım 3: Dinamik Route Parametreleri ve Query String Kullanımı
Gerçek dünya senaryolarında, belirli bir kaynağa erişmek için dinamik değerlere ihtiyaç duyarız. Örneğin, belirli bir ID'ye sahip kullanıcıyı getirmek veya arama sonuçlarını filtrelemek bu kapsama girer. Express, dinamik rotaları tanımlamak için Route Parametreleri (Route Params) ve filtreleme işlemleri için Sorgu Dizileri (Query Strings) mekanizmalarını sunar.
Route parametreleri URL yolunun bir parçasıdır ve iki nokta üst üste (:) işaretiyle tanımlanır. Query string ise URL'nin sonuna soru işareti (?) ile eklenen anahtar-değer çiftleridir.
import express from 'express';
const app = express();
app.use(express.json());
const urunler = [
{ id: 101, ad: "Akıllı Telefon", kategori: "Elektronik", fiyat: 15000 },
{ id: 102, ad: "Dizüstü Bilgisayar", kategori: "Elektronik", fiyat: 35000 },
{ id: 103, ad: "Klasik Roman", kategori: "Kitap", fiyat: 150 }
];
// 1. Dinamik Route Parametresi Kullanımı (:id)
// Örnek İstek: GET /api/urunler/101
app.get('/api/urunler/:id', (req, res) => {
const urunId = parseInt(req.params.id, 10);
const urun = urunler.find(u => u.id === urunId);
if (!urun) {
return res.status(404).json({
success: false,
message: "Aranan ürün bulunamadı."
});
}
res.status(200).json({
success: true,
data: urun
});
});
// 2. Query String Kullanımı (req.query)
// Örnek İstek: GET /api/urunler?kategori=Elektronik
app.get('/api/urunler', (req, res) => {
const { kategori } = req.query;
if (kategori) {
const filtrelenmisUrunler = urunler.filter(
u => u.kategori.toLowerCase() === kategori.toLowerCase()
);
return res.status(200).json({
success: true,
filtre: kategori,
data: filtrelenmisUrunler
});
}
res.status(200).json({
success: true,
data: urunler
});
});
app.listen(3000);
Bu kod örneğinde, req.params.id ifadesi ile URL'den gelen dinamik ID değerini yakaladık. URL'den gelen tüm parametrelerin varsayılan olarak metin (string) tipinde olduğunu unutmamalıyız; bu yüzden sayısal karşılaştırma yapmadan önce parseInt() fonksiyonu ile dönüşüm gerçekleştirdik. Query string parametreleri ise doğrudan req.query nesnesi üzerinden okunur.
Adım 4: Express Router ile Modüler Routing Yapısı
Projeniz büyüdükçe, tüm rotaları tek bir app.js dosyası içinde tanımlamak kodun okunabilirliğini azaltır ve bakımı imkansız hale getirir. Express, bu sorunu çözmek için rotaları bağımsız dosyalara bölmemizi sağlayan express.Router sınıfını sunar. Bu yapı sayesinde her modülü kendi dosyası altında yönetebiliriz.
Şimdi projemizde modüler bir yapı kuralım. Öncelikle projenizde routes adında bir klasör oluşturun ve içine urunRoutes.js dosyasını ekleyin.
Aşağıdaki kod bloğu, routes/urunRoutes.js dosyasının içeriğini temsil eder. Burada Express Router nesnesi oluşturulup dışa aktarılmaktadır:
import express from 'express';
const router = express.Router();
// Mock veri seti
const urunler = [
{ id: 1, ad: "Kablosuz Kulaklık" },
{ id: 2, ad: "Mekanik Klavye" }
];
// Router seviyesinde GET rotası (Kök dizin '/' aslında '/api/urunler' olacaktır)
router.get('/', (req, res) => {
res.status(200).json({
success: true,
data: urunler
});
});
// Router seviyesinde POST rotası
router.post('/', (req, res) => {
const { ad } = req.body;
if (!ad) {
return res.status(400).json({ success: false, message: "Ürün adı zorunludur." });
}
const yeniUrun = { id: urunler.length + 1, ad };
urunler.push(yeniUrun);
res.status(201).json({ success: true, data: yeniUrun });
});
export default router;
Şimdi oluşturduğumuz bu modüler router yapısını ana uygulama dosyamız olan app.js içerisine dahil edelim. app.use() fonksiyonu ile bu rotaların hangi ön ek (prefix) altında çalışacağını belirliyoruz:
import express from 'express';
import urunRouter from './routes/urunRoutes.js';
const app = express();
app.use(express.json());
// Oluşturduğumuz router modülünü '/api/urunler' ön eki ile uygulamaya bağlıyoruz
app.use('/api/urunler', urunRouter);
app.listen(3000, () => {
console.log("Modüler yönlendirme sistemi aktif. Port: 3000");
});
Bu modüler yaklaşım sayesinde, ürünlerle ilgili tüm işlemler (GET, POST, PUT, DELETE) tek bir dosyada (urunRoutes.js) toplanmış oldu. Yarın bir gün "kullanıcılar" veya "siparişler" modülü eklemek istediğimizde, sadece yeni bir router dosyası oluşturup app.js dosyasına kaydetmemiz yeterli olacaktır.
Adım 5: Middleware (Ara Yazılım) Entegrasyonu ve Route Güvenliği
Ara yazılımlar (middleware), istemciden gelen istek ile sunucunun vereceği yanıt arasında çalışan fonksiyonlardır. Kimlik doğrulama (authentication), yetkilendirme (authorization), veri doğrulama ve loglama gibi kritik işlemler ara yazılımlar vasıtasıyla gerçekleştirilir.
Yönlendirme güvenliğini sağlamak için, belirli rotalara erişimi kısıtlayan bir API Anahtarı (API Key) kontrol mekanizması tasarlayalım. Bu ara yazılım, istemcinin başlık (header) bilgisinde geçerli bir anahtar gönderip göndermediğini denetleyecektir.
import express from 'express';
const app = express();
app.use(express.json());
// Özel bir Ara Yazılım (Middleware) Fonksiyonu
const apiKeyKontrol = (req, res, next) => {
const apiKey = req.headers['x-api-key'];
// Gerçek senaryolarda bu değer veritabanından veya çevre değişkenlerinden (.env) okunur
const GECERLI_API_KEY = "ozel-guvenli-anahtar-2026";
if (!apiKey || apiKey !== GECERLI_API_KEY) {
return res.status(401).json({
success: false,
message: "Yetkisiz Erişim! Geçersiz veya eksik API anahtarı."
});
}
// Her şey yolundaysa bir sonraki fonksiyonun/rotanın çalışmasını tetikliyoruz
next();
};
// Güvenli Rota: Sadece geçerli API anahtarı sunan istemciler erişebilir
app.get('/api/admin/raporlar', apiKeyKontrol, (req, res) => {
res.status(200
Express Rotalarında Gelişmiş Hata Yönetimi (Error Handling)
Profesyonel bir Node.js uygulamasında rotaların (routes) sadece başarılı senaryoları değil, aynı zamanda çalışma zamanında (runtime) oluşabilecek hataları da güvenli bir şekilde ele al


Yorumlar (0)
Yorum Yaz