Node.js Express中ERR_HTTP_HEADERS_SENT错误求助
问题排查:ERR_HTTP_HEADERS_SENT错误解决
错误信息
node:internal/errors:464 ErrorCaptureStackTrace(err); ^ Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client at new NodeError (node:internal/errors:371:5) at ServerResponse.setHeader (node:_http_outgoing:576:11) at ServerResponse.header (C:\Users\ND\StudioProjects\pos\node_modules\express\lib\response.js:794:10) at ServerResponse.send (C:\Users\ND\StudioProjects\pos\node_modules\express\lib\response.js:174:12) at ServerResponse.json (C:\Users\ND\StudioProjects\pos\node_modules\express\lib\response.js:278:15) at deleteAddItem (file:///C:/Users/ND/StudioProjects/pos/controller/bill/addItem.controller.js:41:21) at processTicksAndRejections (node:internal/process/task_queues:96:5) { code: 'ERR_HTTP_HEADERS_SENT' }
相关代码
控制器代码
const deleteAddItem = async (req, res) => { try { const getItem = req.body; const deleteItem = await AddItem.findOneAndDelete(getItem); if (!deleteItem) res.status(203).json({ msg: "No bill available" }); return res.status(202).json({ msg: "Bill Deleted" }); } catch (error) { console.error(error); res.status(500).json({ msg: "Internal Server Error deleteAddItem", error }); } };
路由配置
billRouter.delete("/deleteAddItem", deleteAddItem);
问题根源
这个错误的核心是同一个请求中多次向客户端发送响应。
当!deleteItem条件成立时,代码执行res.status(203).json(...)已经发送了一次响应,但因为没有用return终止函数,后续代码会继续执行return res.status(202).json(...),导致第二次尝试发送响应,触发ERR_HTTP_HEADERS_SENT错误。
修复方案
在条件分支发送响应后,用return终止函数,避免后续代码继续执行:
const deleteAddItem = async (req, res) => { try { const getItem = req.body; const deleteItem = await AddItem.findOneAndDelete(getItem); if (!deleteItem) { return res.status(203).json({ msg: "No bill available" }); } return res.status(202).json({ msg: "Bill Deleted" }); } catch (error) { console.error(error); res.status(500).json({ msg: "Internal Server Error deleteAddItem", error }); } };
也可以用else分支区分逻辑,达到同样效果:
const deleteAddItem = async (req, res) => { try { const getItem = req.body; const deleteItem = await AddItem.findOneAndDelete(getItem); if (!deleteItem) { res.status(203).json({ msg: "No bill available" }); } else { res.status(202).json({ msg: "Bill Deleted" }); } } catch (error) { console.error(error); res.status(500).json({ msg: "Internal Server Error deleteAddItem", error }); } };
内容的提问来源于stack exchange,提问作者MYOUSUFFS
相关产品推荐
相关产品推荐

