Express nhận diện error handler hoàn toàn dựa vào số tham số của hàm (fn.length === 4).
Nếu bạn viết (err, req, res) — bỏ next — Express coi đó là middleware thường với err được hiểu là req, và lỗi sẽ rơi xuống default error handler thay vì hàm của bạn.
js
// wrong: only 3 params -> treated as a normal middleware
app.use((err, req, res) => res.status(500).json({ message: err.message }))
// correct: 4 params, even if next is unused
app.use((err, req, res, next) => {
if (res.headersSent) return next(err)
res.status(err.status ?? 500).json({ message: err.message })
})Hai điểm hay bị hỏi thêm:
- Error middleware phải đặt sau tất cả app.use() và route, nếu không lỗi từ route sẽ không đi qua nó.
- Nếu response đã bắt đầu gửi (res.headersSent === true) thì phải next(err) để default handler đóng kết nối, không được ghi thêm.
Không cần đặt tên tham số là next — chỉ số lượng tham số mới quan trọng.