Error handling yang konsisten membuat API mudah digunakan dan di-debug.
Prinsip:
- Gunakan status code yang tepat
- Format error yang konsisten
- Pesan yang actionable (jelas apa yang salah)
- Jangan expose internal details di production
Error response standard:
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Input tidak valid",
"details": [
{ "field": "email", "message": "Format email tidak valid" },
{ "field": "name", "message": "Minimal 2 karakter" }
]
}
}
Error codes:
| Code | Status | Kapan |
|---|---|---|
VALIDATION_ERROR |
400/422 | Input tidak valid |
UNAUTHORIZED |
401 | Belum login |
FORBIDDEN |
403 | Tidak punya akses |
NOT_FOUND |
404 | Resource tidak ada |
CONFLICT |
409 | Data sudah ada (duplicate) |
INTERNAL_ERROR |
500 | Bug di server |
Centralized error handler:
app.use((err, req, res, next) => {
const status = err.status || 500;
const message = status === 500 ? "Internal server error" : err.message;
// Log full error for debugging
if (status === 500) console.error(err.stack);
res.status(status).json({
error: { code: err.code || "UNKNOWN", message }
});
});