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. missing return before 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' }) // no return
res.json(user) // runs anyway -> throws
})
// 2. responding then calling next() -> a later handler responds again
// 3. an async callback replies after the sync path already repliedCá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.