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.
Middleware mantığı modern API geliştirmenin temelidir. Aynı kontrolü (örneğin "kullanıcı giriş yapmış mı") her endpoint'te tekrar yazmak yerine bir ortak middleware yazıp tüm korumalı endpoint'lere uygularsınız. Kod tekrarı azalır; bakım kolaylaşır.
Aşağıda Express middleware mantığını, sık kullanılan middleware türlerini, custom middleware yazımını ve hata yönetimini anlatıyoruz.
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.
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);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
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);
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.
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.
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 })
});
});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());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)

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
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.
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.



