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

Node.js+Express中Error [ERR_HTTP_HEADERS_SENT]错误的原因与解决方法

关于Error [ERR_HTTP_HEADERS_SENT]的原因及解决方法

错误原因

这个错误的核心是同一个请求中被多次发送响应。HTTP协议规定一个请求只能对应一次响应,一旦你通过res.json()、res.send()这类方法发送过响应后,再尝试发送任何响应,Node.js就会抛出这个错误。

你提供的try/catch代码本身逻辑没问题,但问题出在这段代码的外部上下文:要么是在执行这段try/catch之前,已经有其他代码发送了响应;要么是这段代码所在的函数里,存在其他分支也会触发响应发送,导致重复响应。

比如常见的错误场景:

app.get('/api/data', (req, res) => {
  // 这里先发送了一次响应
  res.send('some initial response');
  
  // 后续执行到你的try/catch,再次发送响应
  try {
    resultset[0].json = JSON.parse(resultset[0].json);
    return res.json({/* ... */});
  } catch (err) {
    return res.json({/* ... */});
  }
});

解决方法

  1. 排查整个请求处理流程,确保只发送一次响应

    • 检查当前路由处理函数的所有分支,确认没有在try/catch之外调用任何发送响应的方法。
    • 特别注意异步操作:如果有数据库查询、文件读取这类异步代码,要避免在异步回调和主流程中都发送响应的情况。
  2. 严格控制响应发送逻辑

    • 用return关键字确保执行到响应发送后,不会继续执行后续代码(你已经在用,但要确保之前没有提前发送响应)。
    • 可以用标志变量跟踪响应状态,避免重复发送:
      let responseSent = false;
      // ...其他逻辑
      if (!responseSent) {
        responseSent = true;
        res.json({/* ... */});
      }
      
  3. 检查代码结构细节
    你提供的代码片段末尾有多余的},可能是粘贴时的问题,但要确认这段代码是否在循环中执行——如果循环多次触发res.json(),也会导致重复响应。

修复后的示例(假设外部无多余响应发送):

app.get('/your-target-route', (req, res) => {
  // 假设这里是获取resultset的逻辑,比如数据库查询
  const resultset = [/* 你的业务数据 */];
  
  try {
    // 增加存在性判断,避免resultset[0]为undefined时报错
    if (resultset[0]?.json) {
      resultset[0].json = JSON.parse(resultset[0].json);
    }
    return res.json({
      success: true,
      data: resultset,
      code: 200
    });
  } catch (err) {
    console.log("Error parsing JSON string: " + err);
    return res.json({
      success: true,
      msg: "json format was wrong",
      code: 200
    });
  }
});

内容的提问来源于stack exchange,提问作者Deva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 23:27:18