NODE.JS EXPRESS MIDDLEWARE KURGULAMAK

Node.js'te Express en yaygın web framework. Bir HTTP isteği geldiğinde tek bir fonksiyon değil bir zincir çalışır: önce log, sonra body parse, sonra authentication middleware, sonra business logic, sonra response. Bu zincirdeki her adım bir middleware'dir.
1. Middleware nedir?
Express'te bir middleware şu imzaya sahip fonksiyondur:
function middleware(req, res, next) {
// bir şey yap
next(); // sonraki middleware'e geç
}- req: Gelen istek nesnesi
- res: Yanıt nesnesi
- next: Sonraki middleware'e geçiş fonksiyonu
next() çağrılırsa zincir devam eder; çağrılmazsa istek askıda kalır (timeout). next(error) hata zincirine düşürür. Bu akışın altyapısını ve HTTP modülü detaylarını derinleştirmek için resmi Node.js dokümantasyonu başvuru kaynağıdır.
2. Temel Express uygulaması
const express = require('express');
const app = express();
// Built-in middleware: JSON body parse
app.use(express.json());
// Custom middleware: logging
app.use((req, res, next) => {
console.log(`${req.method} ${req.url}`);
next();
});
// Route handler
app.get('/users', (req, res) => {
res.json({ users: [] });
});
app.listen(3000);3. Middleware türleri
1. Application-level middleware
Tüm uygulamaya uygulanır.
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(express.static('public'));2. Router-level middleware
Belirli route'lara uygulanır.
const router = express.Router();
router.use(authMiddleware); // sadece bu router'daki route'lar
router.get('/profile', (req, res) => { ... });
router.post('/profile', (req, res) => { ... });
app.use('/api', router);3. Error-handling middleware
Hatalar için özel; 4 argüman alır.
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).json({ error: 'Bir şey ters gitti' });
});4. Built-in middleware
- express.json(): JSON body parse
- express.urlencoded(): Form data parse
- express.static(): Statik dosya servisi
5. Third-party middleware
- cors: CORS yönetimi
- helmet: Güvenlik header'ları
- morgan: HTTP istek loglama
- compression: Response sıkıştırma
4. Yaygın middleware örnekleri
Authentication middleware
function authenticate(req, res, next) {
const token = req.headers.authorization?.split(' ')[1];
if (!token) {
return res.status(401).json({ error: 'Token gerekli' });
}
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = decoded;
next();
} catch (error) {
res.status(403).json({ error: 'Geçersiz token' });
}
}
// Kullanım
app.get('/api/profile', authenticate, (req, res) => {
res.json({ user: req.user });
});Logging middleware
function logger(req, res, next) {
const start = Date.now();
res.on('finish', () => {
const duration = Date.now() - start;
console.log(`${req.method} ${req.url} - ${res.statusCode} - ${duration}ms`);
});
next();
}
app.use(logger);Rate limiting middleware
const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 dakika
max: 100, // IP başına 100 istek
message: 'Çok fazla istek, biraz bekleyin'
});
app.use('/api/', limiter);Validation middleware
function validateUser(req, res, next) {
const { email, password } = req.body;
if (!email || !email.includes('@')) {
return res.status(400).json({ error: 'Geçerli e-posta girin' });
}
if (!password || password.length < 8) {
return res.status(400).json({ error: 'Şifre en az 8 karakter olmalı' });
}
next();
}
app.post('/api/register', validateUser, registerHandler);
5. Middleware sırası
Express middleware'leri tanımlandığı sırada çalıştırır. Doğru sıra kritik:
// Doğru sıra
app.use(helmet()); // 1. Güvenlik header'ları
app.use(cors()); // 2. CORS
app.use(express.json()); // 3. Body parse
app.use(logger); // 4. Logging
app.use(authenticate); // 5. Authentication (korumalı route'larda)
app.use('/api', routes); // 6. Route handler
app.use(errorHandler); // 7. Error handler (en son)Error handler en sonda olmalı; diğerlerini geçen hataları yakalar.
6. Async middleware
Modern async/await ile middleware yazımı:
async function fetchUser(req, res, next) {
try {
const user = await db.users.findById(req.params.id);
if (!user) {
return res.status(404).json({ error: 'Kullanıcı yok' });
}
req.user = user;
next();
} catch (error) {
next(error); // hata zincirine ilet
}
}
app.get('/users/:id', fetchUser, (req, res) => {
res.json(req.user);
});Önemli: async middleware'de try/catch ile hata yakalamayı unutmayın; sessiz hatalar bug üretir. Veya express-async-errors paketi otomatik halleder.
7. Hata yönetimi
Custom error class
class ApiError extends Error {
constructor(statusCode, message) {
super(message);
this.statusCode = statusCode;
}
}
// Kullanım
app.get('/api/data', (req, res, next) => {
if (!req.query.id) {
return next(new ApiError(400, 'ID gerekli'));
}
// ...
});Global error handler
app.use((err, req, res, next) => {
// Development'ta detaylı log
if (process.env.NODE_ENV !== 'production') {
console.error(err.stack);
}
res.status(err.statusCode || 500).json({
error: err.message || 'Sunucu hatası',
...(process.env.NODE_ENV !== 'production' && { stack: err.stack })
});
});8. Güvenlik middleware'leri
helmet
Çeşitli güvenlik header'larını otomatik ekler.
const helmet = require('helmet');
app.use(helmet());
// XSS, clickjacking, MIME sniffing korumalarıcors
Cross-origin istekleri yönetir.
const cors = require('cors');
app.use(cors({
origin: 'https://siteniz.com',
credentials: true
}));express-mongo-sanitize
MongoDB injection koruması.
const mongoSanitize = require('express-mongo-sanitize');
app.use(mongoSanitize());9. Production checklist
- helmet ile güvenlik header'ları
- cors doğru ayarlı
- express.json() body size limit (varsayılan 100kb)
- Rate limiting aktif
- Authentication tüm korumalı route'larda
- Input validation her endpoint'te
- Error handler tüm hataları yakalıyor
- Logging production-ready (morgan, winston)
- compression ile yanıt sıkıştırma
- Trust proxy ayarı (load balancer arkasında)

10. Yanlış Anlaşılan Noktalar
- next() çağırmamak. İstek askıda kalır; timeout olur
- next() sonrası response göndermek. "Cannot set headers after they are sent" hatası
- Yanlış middleware sırası. Auth body parse'tan önce gelirse JSON erişimi yok
- Async middleware'de try/catch unutmak. Promise reject sessiz kalır
- Error handler'ı yanlış yere koymak. 4 argümanlı middleware en sonda olmalı
- Tüm route'larda authenticate kullanmak. Public route'lar bypass edilmeli
11. Sonraki Aşamalar
Express middleware modern Node.js geliştirmenin temeli. Bilgiyi sıralı yol haritasıyla edinmek için Node.js eğitimi programları Express, middleware ve API tasarımı konularını birlikte aktarır.
12. Kritik Detaylar
Express middleware'ler istek-yanıt zincirinde ara işlemler yapan fonksiyonlardır. Application-level middleware, router-level, error-handling ve third-party olmak üzere türleri var. Sıra kritik: güvenlik > CORS > body parse > auth > business logic > error handler. helmet, cors, rate limit, validation modern API'nin standart güvenlik katmanları. Async middleware'de try/catch zorunlu; aksi durumda sessiz hatalar oluşur. Middleware mantığı kod tekrarını azaltır, bakımı kolaylaştırır.
Sıkça Sorulan Sorular
next() çağırmazsam ne olur?
İstek askıda kalır; zincir ilerlemez. Sonunda HTTP timeout olur (genelde 2 dakika); kullanıcı 'Server didn't respond' hatası alır. Eğer middleware işini tamamlayıp yanıt da vermiyorsa next() mutlaka çağrılmalı. Eğer middleware yanıt veriyorsa (res.send, res.json) next() çağrılmaz; aksi durumda 'Cannot set headers after sent' hatası gelir.
Middleware sırası neden bu kadar önemli?
Express sırayla çalışır; sonraki middleware öncekinin sonucuna bağımlıdır. Auth middleware body parse'tan önce gelirse req.body undefined olur. Error handler en sonda olmalı; aksi durumda sonraki middleware'lerin hataları yakalanmaz. helmet en başta olmalı; sonraki middleware'ler header'lara dokunmadan önce güvenlik header'ları set edilir. Yanlış sıra bug'ların yüzde 30'unun sebebidir.
Async middleware'de try/catch zorunlu mu?
Express'in eski versiyonlarında zorunlu; modern versiyonda 5.x ile otomatik handling geldi ama hâlâ explicit try/catch öneriliyor. <strong>express-async-errors</strong> paketi otomatik halleder; tek satır ekleyince async hatalar otomatik error handler'a düşer. Bu paket olmadan unhandled promise rejection oluşur; sessiz hata.
helmet middleware ne kadar koruma sağlar?
Kapsamlı; 11 farklı <strong>güvenlik header'ı</strong> set eder. XSS koruması, clickjacking önleme, MIME sniffing koruması, HSTS, referrer policy, content security policy ve daha fazlası. Tek satır 'app.use(helmet())' yazmak temel güvenlik katmanını kurar. Production'da olmazsa olmaz; Express dokümantasyonu da önerir.
Rate limit ne kadar olmalı?
Endpoint tipine göre değişir. Public API: dakika başına IP başına 60-100 istek. Login endpoint: dakika başına 5-10 istek (brute force koruması). Write endpoint'leri (POST, PUT, DELETE): genel okuma endpoint'lerinden daha sıkı. Auth gerektiren endpoint'ler: kullanıcı ID bazlı <strong>rate limit</strong>, IP yerine. express-rate-limit paketi ile esnek konfigürasyon mümkün.
CORS hata veriyor; neyi kontrol etmeliyim?
Üç ana kontrol: birincisi origin doğru mu (https vs http, www vs non-www); ikincisi credentials true ise origin '*' kullanılamaz (specific olmalı); üçüncüsü preflight (OPTIONS) request'ler için Allow-Methods ve Allow-Headers doğru mu. cors middleware default ayarlar çoğu basit durum için yeterli ama production'da özel yapılandırma gerekir.
Tüm Express uygulamasında authenticate kullanılır mı?
Hayır, sadece korumalı route'larda. Public endpoint'ler (login, register, health check, public content) authenticate olmadan erişilebilir olmalı. İki yaklaşım: ya specific route'lara authenticate ekle (route.get('/protected', authenticate, handler)) ya da router seviyesinde uygula (router.use(authenticate) sonra korumalı route'lar). Global 'app.use(authenticate)' yanlış; public route'ları da bloklar.


