Handling Error di Express.js: Contoh Best Practice untuk Aplikasi yang Lebih Stabil

Handling Error di Express.js: Contoh Best Practice untuk Aplikasi yang Lebih Stabil

Daftar Isi
    2025-06-09

    Dalam dunia pemrograman, error atau kesalahan adalah hal yang wajar dan pasti terjadi. Namun, yang paling penting adalah bagaimana kita menangani error tersebut agar aplikasi tidak crash, user tetap mendapatkan pengalaman yang baik, dan pengembang bisa dengan mudah mengetahui serta memperbaiki masalah.

    Di artikel ini, kita akan membahas best practice handling error di Express.js lengkap dengan contoh kode yang bisa kamu langsung terapkan di project backend Node.js-mu.


    Kenapa Error Handling itu Penting?

    Tanpa penanganan error yang tepat, sebuah error kecil bisa membuat aplikasi berhenti berfungsi (crash), menyebabkan downtime, dan membuat pengguna frustrasi. Dengan sistem error handling yang baik, kita bisa:

    • Menghindari crash aplikasi secara mendadak
    • Memberikan pesan error yang jelas dan ramah pengguna
    • Membantu developer cepat menemukan sumber masalah
    • Menjaga keamanan aplikasi dengan tidak membocorkan informasi sensitif

    Gunakan Middleware Error Handler di Express.js

    Express menyediakan mekanisme khusus untuk menangani error melalui middleware yang memiliki empat parameter: (err, req, res, next).

    Berikut contoh middleware error handler sederhana:

    app.use((err, req, res, next) => {
      console.error(err.stack); // Log stack trace error ke console
      res.status(500).send({ message: 'Ada masalah server nih!' }); // Kirim response error ke client
    });
    

    Middleware ini wajib diletakkan paling akhir di file server.js atau app.js setelah semua route dan middleware lainnya.


    Pisahkan Error Berdasarkan Jenisnya

    Tidak semua error sama. Penting untuk membedakan error yang berasal dari client dan error yang berasal dari server:

    Jenis Error Contoh Status HTTP Keterangan
    Client Error (400) Data tidak valid, input salah 400 Kesalahan dari sisi user/input
    Server Error (500) Database down, server crash 500 Masalah di server/backend

    Dengan membedakan status ini, user tahu bahwa kesalahan ada di pihak mereka (misal input salah), atau server yang bermasalah.


    Tangkap Error di Fungsi Async/Await

    Ketika menggunakan async/await di Express route handler, kita harus pakai blok try...catch untuk menangkap error dan meneruskannya ke middleware error handler dengan next(err).

    Contoh:

    app.get('/users/:id', async (req, res, next) => {
      try {
        const user = await User.findById(req.params.id);
        if (!user) {
          // Buat error dengan status khusus
          const error = new Error('User tidak ditemukan');
          error.status = 404;
          throw error;
        }
        res.send(user);
      } catch (err) {
        next(err); // Teruskan error ke middleware error handler
      }
    });
    

    Middleware Error Handler dengan Respons Status Dinamis

    Supaya lebih fleksibel, middleware error handler bisa mengirim status yang berbeda sesuai error yang diterima:

    app.use((err, req, res, next) => {
      console.error(err.stack);
      const status = err.status || 500; // Pakai status error jika ada, default 500
      res.status(status).send({ message: err.message || 'Ada masalah server nih!' });
    });
    

    Logging dan Monitoring Error: Kunci Perbaikan Berkelanjutan

    Selain menampilkan error ke user, sangat disarankan untuk menyimpan log error ke file atau menggunakan layanan monitoring seperti Sentry, Loggly, atau Papertrail.

    Keuntungan monitoring error:

    • Dapat notifikasi real-time jika terjadi error kritis
    • Bisa menganalisis pola error untuk meningkatkan aplikasi
    • Mempermudah debugging di production environment

    Kesimpulan

    Handling error yang baik sangat penting untuk menjaga stabilitas aplikasi dan kualitas pengalaman user. Berikut ringkasan best practice handling error di Express.js:

    1. Gunakan middleware error handler dengan 4 parameter
    2. Pisahkan error client dan server dengan status HTTP yang tepat
    3. Tangkap error di route async dengan try...catch dan teruskan dengan next(err)
    4. Gunakan logging dan monitoring untuk memantau error di produksi

    Dengan pola error handling ini, aplikasi backend kamu akan lebih tangguh dan mudah dikelola. Mau belajar lebih banyak soal backend Node.js? Yuk, ikuti kelas dan bootcamp coding di Nusacodes dengan modul terarah yang siap bikin kamu jadi lebih paham soal Backend!