Express 4 chỉ bọc try/catch quanh lời gọi handler đồng bộ.
Một hàm async trả về Promise ngay lập tức, lỗi xảy ra sau đó nằm ở dạng rejected promise — Express không biết tới, request treo cho tới timeout và Node ghi UnhandledPromiseRejection.
// Express 4: this error never reaches the error middleware
app.get('/users', async (req, res) => {
const users = await db.query('...') // throws -> unhandled rejection
res.json(users)
})Ba cách xử lý ở Express 4:
- try/catch rồi next(err) trong từng handler.
- Bọc bằng wrapper: const wrap = fn => (req, res, next) => Promise.resolve(fn(req, res, next)).catch(next).
- Dùng express-async-errors (patch toàn cục) hoặc express-async-handler.
Express 5 đưa việc này vào core: mọi lỗi ném ra hoặc promise bị reject từ middleware/handler đều được tự động forward tới error-handling middleware, nên wrapper không còn cần thiết. Đây là lý do khi phỏng vấn hỏi "code này chạy trên Express mấy" thì phải hỏi lại phiên bản trước khi trả lời.