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

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
  });
});

关键修改点

  1. 分离CORS逻辑:将CORS响应头设置移到代理前的中间件中,确保在代理响应发送前完成头设置,避免后续重复操作。
  2. 处理OPTIONS预检:直接响应OPTIONS请求,无需转发到目标服务器,减少不必要的代理操作。
  3. 聚焦proxyReq职责:在proxyReq事件中只操作目标服务器的请求对象,不再修改客户端响应头。
  4. 正确处理请求体:用proxyReq.end()替代proxyReq.write(),确保请求体被完整替换,避免部分写入导致的异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 04:44:57