Middleware
Filter permintaan HTTP yang masuk ke aplikasi Anda.
Pengenalan
Middleware menyediakan mekanisme yang nyaman untuk memeriksa dan memfilter permintaan HTTP. Kasus penggunaan umum termasuk autentikasi, logging, CORS, dan pembatasan laju.
Membuat Middleware
Menggunakan CLI
ereact make:middleware AuthMiddleware
Middleware Dasar
import { Middleware, Request, Response, NextFunction } from '@ereactthohir/core';
export class AuthMiddleware extends Middleware {
public async handle(req: Request, res: Response, next: NextFunction) {
if (!req.user) {
return res.status(401).json({ error: 'Tidak terautentikasi' });
}
return next();
}
}
Menggunakan Middleware
Pada Rute
Route.get('/dashboard', [DashboardController, 'index'])
.middleware('auth');
// Beberapa middleware
Route.get('/admin', [AdminController, 'index'])
.middleware(['auth', 'admin']);
Pada Kontroler
export class DashboardController extends Controller {
constructor() {
super();
this.middleware('auth');
this.middleware('admin').only(['destroy']);
this.middleware('verified').except(['index']);
}
}
Pada Grup Rute
Route.middleware(['auth']).group(() => {
Route.get('/dashboard', [DashboardController, 'index']);
Route.get('/profile', [ProfileController, 'show']);
});
Contoh Middleware Umum
Middleware Autentikasi
export class AuthMiddleware extends Middleware {
public async handle(req: Request, res: Response, next: NextFunction) {
const token = req.header('Authorization')?.replace('Bearer ', '');
if (!token) {
return res.status(401).json({ error: 'Token tidak disediakan' });
}
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = await User.find(decoded.id);
return next();
} catch (error) {
return res.status(401).json({ error: 'Token tidak valid' });
}
}
}
Middleware CORS
export class CorsMiddleware extends Middleware {
public async handle(req: Request, res: Response, next: NextFunction) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
if (req.method === 'OPTIONS') {
return res.status(200).end();
}
return next();
}
}
Middleware Logging
export class LoggingMiddleware extends Middleware {
public async handle(req: Request, res: Response, next: NextFunction) {
const start = Date.now();
// Log permintaan
console.log(`[${new Date().toISOString()}] ${req.method} ${req.path}`);
// Lanjutkan ke middleware berikutnya
const result = await next();
// Log waktu respons
const duration = Date.now() - start;
console.log(`[${new Date().toISOString()}] Selesai dalam ${duration}ms`);
return result;
}
}
Praktik Terbaik
- Jaga middleware tetap fokus: Satu tanggung jawab per middleware
- Urutan itu penting: Daftarkan middleware dalam urutan yang benar
- Performa: Hindari operasi berat di middleware global
- Penanganan kesalahan: Selalu tangani kesalahan dengan anggun
- Pengujian: Tulis pengujian untuk logika middleware