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!
[NODE JS] Middleware Nedir? İlk Middleware'inizi Yazın
Express.js'in en güçlü özelliği middleware sistemidir. Middleware, HTTP isteği ile response arasında çalışan fonksiyonlardır. İstek sunucuya geldiğinde sırasıyla tanımlanmış middleware'lerden geçer ve her middleware isteği inceleyebilir, değiştirebilir, response gönderebilir veya next() çağrısıyla bir sonraki middleware'e geçebilir. Bu yapıya "middleware pipeline" veya "middleware chain" denir.
Middleware kavramını bir fabrika üretim bandı gibi düşünebilirsiniz. Hammadde (request) banda girer ve her istasyonda (middleware) bir işlem yapılır: kontrol edilir, şekillendirilir, etiketlenir ve sonunda paketlenip (response) çıkar. Herhangi bir istasyonda sorun varsa ürün reddedilebilir (hata response'u) ve bant durur.
Express'te neredeyse her şey middleware'dir. express.json() bir middleware, express.static() bir middleware, route handler'lar bile teknik olarak middleware'dir. Tek fark route handler'ların genellikle response göndermesi ve next() çağırmamasıdır.
Bir middleware fonksiyonu üç parametre alır: req, res ve next. req istek objesini, res response objesini, next ise kontrolü bir sonraki middleware'e geçiren fonksiyonu temsil eder. Eğer middleware response göndermiyorsa mutlaka next() çağırmalıdır. Aksi halde istek havada kalır ve client timeout alır. Bu en sık yapılan middleware hatasıdır.
Middleware'ler iki şekilde tanımlanabilir: application-level ve route-level. app.use() ile tanımlanan middleware tüm isteklerde çalışır. app.get('/users', middleware, handler) şeklinde tanımlanan middleware ise sadece o route'ta çalışır. Ayrıca Router seviyesinde de middleware tanımlayabilirsiniz.
Middleware sırası çok önemlidir. Express middleware'leri tanımlandıkları sırada çalıştırır. Bu yüzden body parser middleware'lerini route'lardan önce, error handler'ları ise en son tanımlamalısınız. Ben bir keresinde CORS middleware'ini route'lardan sonra eklemiştim ve CORS hatası almaya devam etmiştim. Saatlerce debug ettikten sonra sıralama hatasını fark ettim.
next() fonksiyonuna parametre geçirirseniz Express bunu hata olarak algılar ve error handling middleware'ine atlar. next('route') ise mevcut route'un kalan callback'lerini atlayıp sonraki route'a geçer. Bu ince farkları bilmek karmaşık middleware zincirleri kurarken çok işe yarar.
Async middleware'ler yazarken dikkat etmeniz gereken bir konu var. Express 4'te async fonksiyondaki rejected Promise'ler otomatik olarak error handler'a yönlendirilmez. try/catch ile sarmalamanız gerekir. Express 5'te bu sorun çözülüyor ama şimdilik dikkatli olmanız lazım. Ya da express-async-errors paketini kullanabilirsiniz.
Middleware'ler arasında veri paylaşmak için req objesine özellik ekleyebilirsiniz. req.kullanici, req.requestId gibi. Bu pattern çok yaygın ve kabul görmüştür. Ama var olan Express özelliklerini ezmemeye dikkat edin. req.body, req.params gibi isimleri kullanmayın.
Third-party middleware'ler de Express ekosisteminin önemli bir parçası. helmet güvenlik header'ları ekler, morgan HTTP logları tutar, compression response'u sıkıştırır, cookie-parser cookie'leri parse eder. Bu paketlerin hepsi middleware olarak çalışır ve app.use() ile eklenir.
JavaScript:
const express = require('express');
const app = express();
app.use(express.json());
// ===== 1. BASIT MIDDLEWARE =====
// Her istekte calisir
app.use((req, res, next) => {{
// Request'e benzersiz ID ekle
req.requestId = Date.now().toString(36) + Math.random().toString(36).substr(2);
// Istek zamanini kaydet (response suresi hesaplamak icin)
req.startTime = Date.now();
console.log(`[${{req.requestId}}] ${{req.method}} ${{req.url}} - Istek alindi`);
next(); // Sonraki middleware'e gec
}});
// ===== 2. RESPONSE SURE MIDDLEWARE =====
app.use((req, res, next) => {{
// Response gonderildiginde sure hesapla
const originalSend = res.send;
res.send = function (body) {{
const duration = Date.now() - req.startTime;
console.log(`[${{req.requestId}}] Tamamlandi: ${{duration}}ms`);
res.set('X-Response-Time', `${{duration}}ms`);
res.set('X-Request-Id', req.requestId);
originalSend.call(this, body);
}};
next();
}});
// ===== 3. KOSULLU MIDDLEWARE =====
// Sadece belirli bir kosulda calisir
function maintenanceMode(req, res, next) {{
const isMaintenanceMode = process.env.MAINTENANCE === 'true';
if (isMaintenanceMode) {{
return res.status(503).json({{
hata: 'Sunucu bakim modunda',
mesaj: 'Lutfen daha sonra tekrar deneyiniz.',
}});
}}
next();
}}
// Gerektiginde aktif edin
// app.use(maintenanceMode);
// ===== 4. MIDDLEWARE FABRIKASI =====
// Parametre alan middleware olusturucu
function ipKontrol(izinliIpler) {{
return (req, res, next) => {{
const clientIp = req.ip || req.connection.remoteAddress;
if (izinliIpler.length > 0 && !izinliIpler.includes(clientIp)) {{
console.log(`Engellenen IP: ${{clientIp}}`);
return res.status(403).json({{ hata: 'Erisim engellendi' }});
}}
next();
}};
}}
// Kullanim: sadece belirli IP'lere izin ver
// app.use('/admin', ipKontrol(['127.0.0.1', '::1']));
// ===== 5. ASYNC MIDDLEWARE =====
async function veritabaniKontrol(req, res, next) {{
try {{
// Veritabani baglantisini kontrol et (simule)
const baglantiDurumu = true; // gercekte db.ping() gibi bir sey
if (!baglantiDurumu) {{
throw new Error('Veritabani baglantisi kurulamadi');
}}
next();
}} catch (err) {{
next(err); // Hatayi error handler'a ilet
}}
}}
app.use(veritabaniKontrol);
// ===== 6. ROUTE-LEVEL MIDDLEWARE =====
function sadeceSaatIci(req, res, next) {{
const saat = new Date().getHours();
if (saat < 9 || saat > 18) {{
return res.status(403).json({{
hata: 'Bu servis sadece 09:00-18:00 arasi aktiftir',
}});
}}
next();
}}
// Sadece bu route'ta calisir
app.get('/api/mesai-servisi', sadeceSaatIci, (req, res) => {{
res.json({{ mesaj: 'Mesai saatleri icinde erisim saglanmistir' }});
}});
// ===== 7. BIRDEN FAZLA MIDDLEWARE ZINCIRLEME =====
function logla(req, res, next) {{
console.log(`Ozel log: ${{req.method}} ${{req.url}}`);
next();
}}
function dogrula(req, res, next) {{
if (!req.headers['x-api-key']) {{
return res.status(401).json({{ hata: 'API anahtari gerekli' }});
}}
next();
}}
function yetkilendir(req, res, next) {{
if (req.headers['x-api-key'] !== 'gizli-anahtar-123') {{
return res.status(403).json({{ hata: 'Gecersiz API anahtari' }});
}}
req.apiKullanici = 'yetkili-kullanici';
next();
}}
// Zincirleme middleware kullanimi
app.get('/api/gizli', logla, dogrula, yetkilendir, (req, res) => {{
res.json({{ mesaj: 'Gizli veriye eristiniz', kullanici: req.apiKullanici }});
}});
// Normal route'lar
app.get('/api/acik', (req, res) => {{
res.json({{ mesaj: 'Bu endpoint herkese acik' }});
}});
// ===== ERROR HANDLING MIDDLEWARE =====
// 4 parametre alir: err, req, res, next
app.use((err, req, res, next) => {{
console.error(`[${{req.requestId || 'unknown'}}] HATA:`, err.message);
res.status(err.status || 500).json({{
hata: process.env.NODE_ENV === 'production'
? 'Sunucu hatasi'
: err.message,
requestId: req.requestId,
}});
}});
app.listen(3000, () => {{
console.log('Middleware ornekleri sunucusu port 3000\'de');
}});
Middleware sistemi Express'i bu kadar esnek ve güçlü yapan temel mekanizma. Kendi middleware'lerinizi yazarak uygulamanızın ihtiyaçlarına göre özelleştirebilirsiniz. Ama aşırıya kaçmayın, her şeyi middleware yapmak kodunuzu karmaşıklaştırabilir. Ortak işlemler için middleware, spesifik iş mantığı için route handler kullanın.
Emeğiniz ve katkınız için teşekkür ederiz!
Konunuz gerekli incelemelerden geçerek onaylandı. Topluluğumuza katkılarınızın devamını bekliyoruz.
İyi forumlar!
Konunuz gerekli incelemelerden geçerek onaylandı. Topluluğumuza katkılarınızın devamını bekliyoruz.
İyi forumlar!

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 0
- Görüntüleme
- 52
- Cevaplar
- 3
- Görüntüleme
- 457
- Cevaplar
- 1
- Görüntüleme
- 36
- Cevaplar
- 2
- Görüntüleme
- 275
Altın Konu
Next.js'de API Oluşturma Ve Kullanma
- Cevaplar
- 12
- Görüntüleme
- 1K
