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

Node.js中使用代理IP发送HTTPS请求出现EPROTO错误如何解决

错误原因

你当前的配置方式不可行,触发EPROTO SSL版本不匹配报错的核心原因如下:

  • Node.js原生https模块不会自动处理HTTPS代理的CONNECT隧道逻辑,你直接将代理IP、端口和目标站点域名同时填入请求配置,相当于直接向代理的8080端口发起TLS握手,而代理此时返回的是HTTP明文响应,无法被TLS层解析因此抛出错误。
  • 你原有代码中GET请求调用req.write(data)发送请求体属于冗余逻辑,GET请求标准格式不需要携带请求体,也可能额外引发请求错误。
可行实现方案

方案1:原生Node.js手动建立代理隧道

无需依赖第三方包,手动完成和代理的CONNECT隧道建立流程,再在隧道上发起HTTPS请求:

const https = require('https');
const net = require('net');

// 代理配置
const PROXY_HOST = '220.135.165.38';
const PROXY_PORT = 8080;
// 目标站点配置
const TARGET_HOST = 'api.spotify.com';
const TARGET_PATH = '/v1/artists/1XqqyIQYMonHgllb1uysL3/albums';

async function sendProxyRequest() {
  const accessToken = await spotifyAuth.getAccessToken();
  // 建立和代理的TCP连接
  const proxySocket = net.connect(PROXY_PORT, PROXY_HOST, () => {
    // 发送CONNECT请求建立通往目标站点的隧道
    proxySocket.write(`CONNECT ${TARGET_HOST}:443 HTTP/1.1\r\nHost: ${TARGET_HOST}:443\r\nConnection: keep-alive\r\n\r\n`);
  });

  proxySocket.once('data', (res) => {
    const resStatus = res.toString().split('\r\n')[0];
    if (!resStatus.includes('200 Connection established')) {
      proxySocket.destroy();
      throw new Error(`代理隧道建立失败: ${resStatus}`);
    }

    // 隧道建立成功后发起HTTPS请求
    const reqOptions = {
      socket: proxySocket,
      hostname: TARGET_HOST,
      path: TARGET_PATH,
      method: 'GET',
      headers: {
        'Authorization': `Bearer ${accessToken}`,
        'Host': TARGET_HOST
      }
    };

    const req = https.request(reqOptions, (res) => {
      console.log(`proxyiprequest() statusCode: ${res.statusCode}`);
      res.on('data', chunk => process.stdout.write(chunk));
    });

    req.on('error', err => console.error('proxyiprequest() err=', err));
    req.end();
  });

  proxySocket.on('error', err => console.error('代理连接错误: ', err));
}

sendProxyRequest();

方案2:使用第三方包简化实现(推荐)

使用成熟的https-proxy-agent包自动处理代理逻辑,兼容性更强、代码更简洁:

  1. 先安装依赖:
npm install https-proxy-agent
  1. 请求代码示例:
const https = require('https');
const HttpsProxyAgent = require('https-proxy-agent');

async function sendProxyRequest() {
  const accessToken = await spotifyAuth.getAccessToken();
  // 初始化代理agent
  const proxyAgent = new HttpsProxyAgent(`http://${PROXY_HOST}:${PROXY_PORT}`);

  const reqOptions = {
    hostname: 'api.spotify.com',
    path: '/v1/artists/1XqqyIQYMonHgllb1uysL3/albums',
    method: 'GET',
    agent: proxyAgent,
    headers: {
      'Authorization': `Bearer ${accessToken}`
    }
  };

  const req = https.request(reqOptions, (res) => {
    console.log(`proxyiprequest() statusCode: ${res.statusCode}`);
    res.on('data', chunk => process.stdout.write(chunk));
  });

  req.on('error', err => console.error('proxyiprequest() err=', err));
  req.end();
}

sendProxyRequest();
注意事项
  • 公开免费代理的可用性、稳定性极低,大概率会出现连接超时、请求被拒绝等问题,生产环境建议使用付费稳定代理服务。
  • 如果使用的代理本身为HTTPS类型,只需将代理地址的前缀替换为https://即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:00:03