Express: Middleware & Penanganan Error
Memahami rantai middleware, membuat logger dan penjaga akses, serta error handler terpusat.
Middleware: pos pemeriksaan di jalur permintaan
Middleware adalah fungsi (req, res, next) yang berjalan di antara permintaan masuk dan handler akhir. Setiap middleware boleh membaca/mengubah req dan res, lalu memilih: meneruskan ke berikutnya dengan next(), atau mengakhiri permintaan dengan mengirim respons.
app.use((req, res, next) => {
console.log(`${req.method} ${req.path}`); // logger sederhana
next(); // lanjut ke middleware / route berikutnya
});
Jika lupa memanggil next() (dan tidak mengirim respons), permintaan menggantung selamanya.
Urutan itu penting
app.use(logger); // 1. jalan untuk semua permintaan
app.use(express.json()); // 2. parsing body
app.get('/produk', handler); // 3. route
app.use(notFound); // 4. tidak ada route cocok
app.use(errorHandler); // 5. PALING AKHIR: error handler
Express menjalankan lapisan sesuai urutan pendaftaran. Parser harus sebelum route yang membutuhkannya; error handler harus paling akhir.
Middleware untuk jalur tertentu
function wajibApiKey(req, res, next) {
if (req.get('x-api-key') !== 'rahasia') {
return res.status(401).json({ error: 'API key tidak valid' }); // hentikan di sini
}
next();
}
app.use('/admin', wajibApiKey); // semua yang diawali /admin
app.get('/admin/laporan', wajibApiKey, handler); // atau per route
Menitipkan data ke handler berikutnya
app.use((req, res, next) => {
req.waktuMulai = Date.now();
next();
});
Penanganan error terpusat
Middleware dengan empat parameter (err, req, res, next) dikenali Express sebagai penanganan error. Ia menerima error yang di-throw atau dikirim lewat next(err).
app.get('/rusak', (req, res) => {
throw new Error('sesuatu meledak'); // sinkron: otomatis ditangkap
});
app.get('/async-rusak', async (req, res) => {
await Promise.reject(new Error('gagal async')); // Express 5: ditangkap otomatis
});
app.use((err, req, res, next) => {
console.error(err.message);
const status = err.status || 500;
res.status(status).json({
error: status === 500 ? 'Terjadi kesalahan pada server' : err.message,
});
});
Untuk 500, jangan kirim detail error ke klien — catat di server saja. Untuk error operasional yang dikenal (validasi, tak ditemukan), beri pesan jelas dan status yang tepat.
Handler 404
app.use((req, res) => {
res.status(404).json({ error: `Rute ${req.method} ${req.path} tidak ditemukan` });
});
JSON rusak dari klien
express.json() memicu error (status 400) bila body bukan JSON valid; error handler-mu menangkapnya dan membalas dengan pesan yang ramah.
Middleware populer
cors— izin akses lintas asal.helmet— header keamanan.morgan— logging permintaan.express-rate-limit— batasi laju permintaan.compression— kompresi respons.