BAB 15 – Error Handling di Backend Node.js: Membuat Aplikasi Lebih Stabil dan Profesional

BAB 15 – Error Handling di Backend Node.js: Membuat Aplikasi Lebih Stabil dan Profesional

Error tidak bisa dihindari dalam aplikasi backend. Request bisa salah, data bisa kosong, database bisa gagal, atau server bisa bermasalah. Tanpa error handling yang baik, aplikasi:

  • mudah crash
  • sulit di-debug
  • membingungkan client

Error handling bukan sekadar menangani error, tapi mengontrol bagaimana error disampaikan ke client.


Jenis Error yang Umum Terjadi di Backend

Beberapa error yang sering muncul:

  • Client Error (4xx) → input salah, data tidak ditemukan
  • Server Error (5xx) → bug, database error, logic error

Backend yang baik harus bisa membedakan keduanya.


Error Handling Dasar di Express.js

Contoh error handling langsung di route:

app.get("/users/:id", (req, res) => {
  const user = null;

  if (!user) {
    return res.status(404).json({
      message: "User tidak ditemukan"
    });
  }

  res.json(user);
});

Pendekatan ini sederhana, tapi tidak cocok untuk aplikasi besar.


Menggunakan Middleware Error Handling

Express menyediakan error handling middleware khusus.

app.use((err, req, res, next) => {
  res.status(500).json({
    message: err.message || "Terjadi kesalahan server"
  });
});

Middleware ini akan menangani semua error secara terpusat.


Mengirim Error dengan next()

Agar error masuk ke middleware, gunakan next().

app.get("/product", (req, res, next) => {
  try {
    throw new Error("Produk tidak ditemukan");
  } catch (error) {
    next(error);
  }
});

Ini membuat kode lebih bersih dan konsisten.


Membuat Custom Error

Custom error memudahkan pengelolaan status code.

class AppError extends Error {
  constructor(message, statusCode) {
    super(message);
    this.statusCode = statusCode;
  }
}

Menggunakannya di route:

app.get("/order/:id", (req, res, next) => {
  next(new AppError("Order tidak ditemukan", 404));
});

Error Handling untuk Async Function

Async error sering menyebabkan server crash jika tidak ditangani.

app.get("/async", async (req, res, next) => {
  try {
    throw new Error("Async error");
  } catch (error) {
    next(error);
  }
});

Selalu pastikan error async dikirim ke middleware.


Membuat Wrapper untuk Async Error

Agar tidak menulis try-catch terus-menerus:

const asyncHandler = fn => (req, res, next) => {
  Promise.resolve(fn(req, res, next)).catch(next);
};

Penggunaan:

app.get("/users", asyncHandler(async (req, res) => {
  throw new Error("Gagal mengambil data");
}));

Pendekatan ini sangat umum di proyek nyata.


Standar Response Error yang Baik

Response error sebaiknya konsisten.

{
  "success": false,
  "message": "Data tidak ditemukan"
}

Konsistensi ini memudahkan frontend menangani error.


Menangani Route Tidak Ditemukan (404)

app.use((req, res) => {
  res.status(404).json({
    message: "Route tidak ditemukan"
  });
});

Letakkan middleware ini setelah semua route.


Memisahkan Error Handling ke File Sendiri

Struktur yang rapi:

middlewares/
├── errorHandler.js
// middlewares/errorHandler.js
export function errorHandler(err, req, res, next) {
  res.status(err.statusCode || 500).json({
    message: err.message
  });
}

Pendekatan ini membuat kode lebih profesional.


Kesalahan Umum dalam Error Handling

Kesalahan yang sering terjadi:

  • menampilkan error mentah ke client
  • tidak menggunakan status code
  • mencampur error logic dan response

Error handling yang buruk sama berbahayanya dengan tidak ada error handling.


Kesimpulan

Error handling adalah fondasi backend yang stabil. Dengan penanganan error yang benar, kita bisa:

  • mencegah server crash
  • memberikan respon yang jelas ke client
  • mempermudah debugging

Bab ini menjadi penutup penting sebelum masuk ke database, autentikasi, dan deployment.