Node.js反向代理报错Error [ERR_HTTP_HEADERS_SENT]的解决方法
修复Node.js Express反向代理中的ERR_HTTP_HEADERS_SENT错误
错误原因
这个错误是因为你在proxyReq事件处理函数中尝试修改客户端响应对象res的头信息,但此时代理已经开始向客户端发送响应,导致重复设置头。proxyReq事件的作用是修改发往目标服务器的请求,而非客户端的响应。
修复方案
将CORS响应头的设置移到代理操作之前,同时确保proxyReq事件只处理目标服务器的请求参数:
import httpProxy from 'http-proxy'; let serverProxy = httpProxy.createProxyServer(); const username = 'anthony'; const password = 'anthony'; const basicAuth = 'Basic ' + Buffer.from(`${username}:${password}`).toString('base64'); // 代理前先设置CORS响应头,处理OPTIONS预检请求 app.use('/dashboard(/*)?', (req, res, next) => { res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization'); res.setHeader('Access-Control-Allow-Credentials', true); // OPTIONS请求直接返回200,无需转发到目标服务器 if (req.method === 'OPTIONS') { return res.sendStatus(200); } next(); }); serverProxy.on('proxyReq', function(proxyReq, req, res) { // 仅修改发往目标服务器的请求头 proxyReq.setHeader('Authorization', basicAuth); // 处理请求体:存在req.body且未设置Content-Length时重新封装 if (req.body && !proxyReq.getHeader('Content-Length')) { const bodyData = JSON.stringify(req.body); proxyReq.setHeader('Content-Type', 'application/json'); proxyReq.setHeader('Content-Length', Buffer.byteLength(bodyData)); // 用end替代write,确保请求体完整替换 proxyReq.end(bodyData); } }); app.all('/dashboard(/*)?', (req, res) => { console.log("Rewritten URL:", req.url); serverProxy.web(req, res, { target: 'http://localhost:80', prependPath: false }); });
关键修改点
- 分离CORS逻辑:将CORS响应头设置移到代理前的中间件中,确保在代理响应发送前完成头设置,避免后续重复操作。
- 处理OPTIONS预检:直接响应OPTIONS请求,无需转发到目标服务器,减少不必要的代理操作。
- 聚焦proxyReq职责:在
proxyReq事件中只操作目标服务器的请求对象,不再修改客户端响应头。 - 正确处理请求体:用
proxyReq.end()替代proxyReq.write(),确保请求体被完整替换,避免部分写入导致的异常。
内容的提问来源于stack exchange,提问作者mohamed yassine
相关产品推荐
相关产品推荐

