Bạn có biết?
Một request lỗi làm treo toàn bộ event loop — mọi user khác đứng hình. Hoặc một promise reject không ai bắt, và Node.js âm thầm chết lúc 3 giờ sáng. Error handling trong Node.js không chỉ là try/catch — nó là hệ thống: bắt đúng chỗ, phân loại lỗi, trả response đúng, và không bao giờ để tiến trình chết vì một lỗi nhỏ.
Phân loại lỗi trước khi xử lý
- Operational errors — lỗi vận hành dự đoán được: DB down, timeout, validation fail, 404. Phải xử lý, retry, trả response đẹp
- Programmer errors — bug: gọi hàm undefined, sai kiểu dữ liệu. Không retry — phải fix code, để crash để phát hiện sớm
Quy tắc vàng: operational → xử lý; programmer → crash sớm. Đừng retry một lỗi do bug — nó sẽ fail mãi mãi và che giấu vấn đề.
Express: error handler trung tâm
// 1. Định nghĩa AppError — lỗi nghiệp vụ có status + code
class AppError extends Error {
constructor(statusCode, message, code) {
super(message);
this.statusCode = statusCode;
this.code = code;
this.isOperational = true;
Error.captureStackTrace(this, this.constructor);
}
}
// 2. Route handler: throw lỗi nghiệp vụ
app.get("/api/users/:id", async (req, res) => {
const user = await db.getUser(req.params.id);
(!user) (, , );
res.(user);
});
= () =>
.((req, res, next)).(next);
app.( {
res.().({ : { : , : } });
});
app.( {
(err.) {
res.(err.).({
: { : err., : err. },
});
}
req..({ err }, );
res.().({ : { : , : } });
});
0 bình luận
Đang tải bình luận...
Để lại bình luận