关于node原生库fetch代理

232 阅读2分钟

在做项目的时候,意外发现某个请求,使用postman和python的requests,都可以请求下来,但是使用node原生的库fetch请求不下来,请求是外国网站国内ip访问不了。所以我开了vpn,但是fetch没有自动换代理的功能。python的requests有。

一、VPN的代理机制

  1. VPN本质是正向代理 VPN作为客户端与目标服务器之间的中转层,所有流量通过VPN服务器转发:
  2. 用户请求 → VPN服务器 → 目标服务器
  3. 目标服务器响应 → VPN服务器 → 用户
  4. IP地址替换过程
  5. 请求发出时:用户设备使用真实IP连接VPN服务器
  6. 请求转发时:VPN服务器使用自身IP地址(即VPN分配的IP)访问目标服务器
  7. 目标服务器视角:仅记录VPN服务器的IP,无法获取用户真实IP

二、Node.js原生fetch的行为

  1. 默认直连,不走系统代理 Node.js原生fetch不会自动识别系统VPN设置,需显式配置代理参数,否则请求将绕过VPN直接连接目标服务器
  2. 需代码显式设置代理

三、IP地址验证结论

未配置代理的fetch 目标服务器看见的是我们发起请求真实的IP,高风险暴露

正确配置代理的fetch 目标服务器看见的是vpn的ip,低风险暴露

四、代码实现

安装依赖 npm install undici 或者 npm i undici

通过undici强制所有fetch请求经VPN代理中转:

const { setGlobalDispatcher, ProxyAgent } = require("undici");

// 设置代理地址(VPN本地端口通常为78901080)
setGlobalDispatcher(new ProxyAgent("http://127.0.0.1:7890")); // :ml-citation{ref="1" data="citationList"}

发起请求并验证IP 访问IP检测服务确认代理生效

fetch("https://httpbin.org/ip")
  .then(res => res.json())
  .then(data => console.log("当前IP:", data.origin)); // 输出应为VPN服务器IP:ml-citation{ref="1,5" data="citationList"}

查看ip:查找自己的IP查看IP或者查看IP