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
相关产品推荐
相关产品推荐

