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.
Contents
- 1 Jenis Error yang Umum Terjadi di Backend
- 2 Error Handling Dasar di Express.js
- 3 Menggunakan Middleware Error Handling
- 4 Mengirim Error dengan next()
- 5 Membuat Custom Error
- 6 Error Handling untuk Async Function
- 7 Membuat Wrapper untuk Async Error
- 8 Standar Response Error yang Baik
- 9 Menangani Route Tidak Ditemukan (404)
- 10 Memisahkan Error Handling ke File Sendiri
- 11 Kesalahan Umum dalam Error Handling
- 12 Kesimpulan
- 13 Related Posts
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.