You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 06:14:59