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.
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:
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.
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.
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
}
});
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!' });
});
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:
Handling error yang baik sangat penting untuk menjaga stabilitas aplikasi dan kualitas pengalaman user. Berikut ringkasan best practice handling error di Express.js:
try...catch
dan teruskan dengan next(err)
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!