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

NodeJS+MongoDB开发遇ERR_HTTP_HEADERS_SENT错误求解决方案

解决(Node)Error [ERR_HTTP_HEADERS_SENT]错误:重复发送HTTP响应头问题

错误原因

这个错误核心是同一个请求里重复发送了HTTP响应。你的代码中,res.sendStatus()方法会直接向客户端发送包含状态码的完整响应(已经发送了响应头和状态码),之后再调用.json()或.send(),就会试图再次修改响应头,触发Node.js报错。

具体修改方案

1. 修复响应发送逻辑

把res.sendStatus()换成res.status(),后者仅设置响应状态码,不会立即结束响应,之后可以继续调用json()或send()发送响应体。

2. 优化数据收集方式(推荐)

MongoDB游标自带toArray()方法,能直接把查询结果转为数组,替代手动用forEach收集数据的写法,代码更简洁高效。

修改后的完整代码

db.js(无需修改)

const { MongoClient } = require("mongodb");

let dbConnection;

module.exports = {
  connectToDb: (cb) => {
    MongoClient.connect("mongodb://localhost:27017/bookstore")
      .then((res) => {
        dbConnection = res.db();
        return cb();
      })
      .catch((error) => {
        console.log(error);
        return cb(error);
      });
  },
  getDb: () => dbConnection,
};

index.js(修改后版本)

const express = require("express");
const { connectToDb, getDb } = require("./db");

const app = express();
let db;

connectToDb((error) => {
  if (!error) {
    app.listen(3000, () => {
      console.log("服务器已在3000端口启动");
    });
    db = getDb();
  }
});

app.get("/bookstore", (req, res) => {
  db.collection("bookstore")
    .find()
    .sort({ author: 1 })
    .toArray() // 直接转为数组,替代forEach手动收集
    .then((mybook) => {
      res.status(200).json(mybook); // 先设状态码,再发响应体
    })
    .catch(() => {
      res.status(500).send("服务器出错"); // 修正语法错误并正确发送响应
    });
});

关键修改点说明

  • res.sendStatus(200) → res.status(200).json(mybook):sendStatus会直接结束响应,status仅设置状态码,允许后续发送响应内容。
  • res.sendStatus(500).send(...) → res.status(500).send(...):避免重复发送响应,同时修正原代码语法错误("were"改为"was")。
  • 用toArray()替代forEach:简化逻辑,减少手动维护数组的工作量,避免潜在异步问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:35:16