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

NodeJS中使用带参数的https.request时出现连接重置问题

解决Node.js中https.request()出现ECONNRESET连接重置错误

问题原因

  • 直接复用原请求的req.headers作为https.request()的请求头,其中Host字段是代理服务器的地址(如localhost:4600),而非目标服务器域名,导致目标服务器无法识别请求,触发连接重置。
  • https.get()是https.request()的GET方法封装,会自动从传入的URL中提取并设置正确的Host头,因此不会出现该问题。

修复方案

方案1:修正请求头的Host字段

复制原请求头并替换为目标服务器的Host:

function forwardRequest(req, res) {
  const agolUrl = buildTargetUrl(req);
  const targetHost = new URL(agolUrl).host;

  const requestOptions = {
    method: req.method,
    // 复制原请求头,覆盖Host为目标服务器地址
    headers: { ...req.headers, host: targetHost },
  };

  const proxyReq = https.request(agolUrl, requestOptions, (proxyRes) => {
    let responseData = '';
    proxyRes.on('data', (chunk) => {
      responseData += chunk;
    });
    proxyRes.on('end', async () => {
      doSomethingWithResponseData(responseData);
      res.writeHead(proxyRes.statusCode, proxyRes.headers);
      res.write(responseData);
      res.end();
    });

  }).on('error', (err) => {
    console.error(err);
    res.status(500).send('An error occurred with proxy.');
  });

  req.pipe(proxyReq);
}

方案2:基于URL生成完整请求配置

直接从目标URL解析生成请求选项,避免手动配置错误:

function forwardRequest(req, res) {
  const agolUrl = buildTargetUrl(req);
  const urlObj = new URL(agolUrl);

  const requestOptions = {
    hostname: urlObj.hostname,
    port: urlObj.port || 443,
    path: `${urlObj.pathname}${urlObj.search}`,
    method: req.method,
    headers: { ...req.headers, host: urlObj.host },
  };

  const proxyReq = https.request(requestOptions, (proxyRes) => {
    let responseData = '';
    proxyRes.on('data', (chunk) => {
      responseData += chunk;
    });
    proxyRes.on('end', async () => {
      doSomethingWithResponseData(responseData);
      res.writeHead(proxyRes.statusCode, proxyRes.headers);
      res.write(responseData);
      res.end();
    });

  }).on('error', (err) => {
    console.error(err);
    res.status(500).send('An error occurred with proxy.');
  });

  req.pipe(proxyReq);
}

补充说明

  • req.pipe(proxyReq)的作用是将原请求的数据流(包括请求体)直接转发给代理请求,确保POST/PUT等带请求体的请求能正确传递数据。
  • 原代码中requestOptions里的port:443属于冗余配置,HTTPS默认端口为443,URL解析会自动处理,可直接移除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:32:27