Express: Middleware & Penanganan Error

Memahami rantai middleware, membuat logger dan penjaga akses, serta error handler terpusat.

Part 18 dari 24 ± 45 menit Gratis

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.

Praktikkan langsung, gratis

Tulis dan jalankan kode langsung di browser, dapatkan penilaian otomatis. Daftar gratis kapan saja untuk menyimpan progres dan meraih sertifikat.

Coba latihan sekarang, tanpa daftar
Bagikan: WhatsApp Facebook LinkedIn X