Khi headers đã được flush xuống client, Node cấm sửa header hoặc bắt đầu một response thứ hai trên cùng request. Bản chất lỗi luôn là gửi response hai lần cho một request.
Ba mẫu code hay gây ra:
js
// 1. thiếu return trước res.json
app.get('/user/:id', async (req, res) => {
const user = await findUser(req.params.id)
if (!user) res.status(404).json({ message: 'not found' }) // thiếu return
res.json(user) // vẫn chạy -> ném lỗi
})
// 2. trả response rồi vẫn gọi next() -> handler sau lại trả response
// 3. callback async trả lời sau khi nhánh sync đã trả lờiCách sửa:
- Luôn return res.json(...) ở mọi nhánh thoát sớm.
- Không gọi next() sau khi đã gửi response.
- Trong error middleware, kiểm tra res.headersSent trước khi ghi: nếu đã gửi thì next(err) để Node đóng kết nối.
- Gom việc trả lời về một chỗ duy nhất mỗi handler thay vì rải res.send nhiều nhánh.