Node.js 18.3 原生fetch如何配置代理发起网络请求
问题根因
Node.js 18 版本内置的原生 fetch 底层基于 undici 实现,不兼容传统 http/https 模块使用的 agent 配置项,传入的 proxy-agent 实例不会被 fetch 识别加载,代理规则完全不生效,请求默认走本机网络出口,所以会返回真实IP。
正确实现方式
不需要使用第三方 proxy-agent 依赖,直接使用 undici 提供的原生 ProxyAgent 即可,Node 18 已内置 undici 依赖,无需额外安装(18.13以下版本如果找不到导出,手动执行npm install undici安装最新版即可)。
全局代理配置
对所有fetch请求生效:
import { ProxyAgent, setGlobalDispatcher } from 'undici'; // 初始化代理实例 const proxyDispatcher = new ProxyAgent('http://80.48.119.28:8080'); // 注册全局网络分发器 setGlobalDispatcher(proxyDispatcher); (async () => { const res = await fetch('https://api.ipify.org?format=json'); const data = await res.json(); console.log(data); // 输出代理IP })();
单请求代理配置
仅对指定请求生效,不影响其他请求:
import { ProxyAgent } from 'undici'; const proxyDispatcher = new ProxyAgent('http://80.48.119.28:8080'); (async () => { const res = await fetch('https://api.ipify.org?format=json', { dispatcher: proxyDispatcher // 注意配置字段是dispatcher,不是agent }); const data = await res.json(); console.log(data); // 输出代理IP })();
注意事项
- 如果代理需要身份认证,直接在代理地址中拼接认证信息即可,格式为
http://用户名:密码@代理地址:端口 - 不要给原生fetch传
agent参数,该参数仅适用于node-fetch等第三方fetch实现,原生fetch不识别该字段
内容的提问来源于stack exchange,提问作者dedLyv22
相关产品推荐
相关产品推荐

