开发者生态
morning
Node.js内置的fetch无法走SOCKS5代理,只能换掉整个HTTP栈吗?
摘要
项目里要访问一个只能通过 SOCKS5 出去的接口,Node 端用的是 18+ 自带的全局 fetch (undici 实现)。卡在代理上:undici 提供的是 ProxyAgent ,只认 HTTP/HTTPS 代理, 没有 SOCKS5 支持 。 试了几种把全局出口改成 SOCKS5 的写法,都没能让内置 fetch 走代理: // 1) 直接把 ProxyAgent 指到 socks5 i...
agent
fetch
undici
socks5
ProxyAgent
SOCKS5
https
127
1080
dispatcher
2026-10-04
1 阅读
约4分钟阅读
摆渡实习生71
字号:
项目里要访问一个只能通过 SOCKS5 出去的接口,Node 端用的是 18+ 自带的全局 fetch (undici 实现)。卡在代理上:undici 提供的是 ProxyAgent ,只认 HTTP/HTTPS 代理,没有 SOCKS5 支持。尝试了一下把全局出口改 SOCKS5 的写法,都可以让内置 fetch 成走代理: // 1) 直接把 ProxyAgent 指到ocks5 import { setGlobalDispatcher, ProxyAgent } from 'undici'; setGlobalDispatcher(new ProxyAgent('socks5://127.0.0.1:1080')); // → 协议未被识别 // 2) 环境变量 // HTTPS_PROXY=socks5://127.0.0.1:1080 // 3) 老的代理方案 import { SocksProxyAgent } from 'socks-proxy-agent'; const agent = new SocksProxyAgent('socks5://127.0.0.1:1080'); // 这个agent只认https.request,fetch使用全局dispatcher,两者不是一套global-agent的bootstrap()也一样:它改的是http/https模块的agent,覆盖不到undici。想确认的是:有没有办法让内置fetch走SOCKS5,而不用把业务代码整体换成axios + agent,或者返回node-fetch?结论如果是「必须自己实现一个Dispatcher」,那想了解需要覆盖哪些方法(dispatch、connect) ?),以及有没有现成的社区实现可以复用,而不是自己糊一个。这次的尝试 setGlobalDispatcher(new ProxyAgent('socks5://127.0.0.1:1080')) —— undici 直接拒绝这个协议, ProxyAgent 只实现了 HTTP CONNECT 隧道,不解析ocks5。 HTTPS_PROXY / HTTP_PROXY 环境变量设置成socks5://… —— undici global-agent 的 bootstrap() —— 它替换了 http.globalAgent / https.globalAgent ,而 fetch 走的是 undici 的全局调度程序,两者完全不是一条路。ocks-proxy-agent 代理后传给 https.request —— 路径是通的,但是换到 fetch 上没有任何入口可以注入代理( fetch 的参数第二个只认调度程序) ,不认代理)。试过undici.Agent的connect选项自定义socket,但对「先建立隧道再发请求」这一步没有现成的钩子。预期获得的结果一个业务代码不用改的方案:仍然await fetch(url),只是简单的出口换成SOCKS5;如果确实做不到,希望明确「必须自己写Dispatcher」这个结论,并指明实现它需要覆盖哪些、有没有已经得维护不错的第三方可以直接使用实现。实际得到的结果现在只能把用到这个接口的那部分代码改成 axios +ocks-proxy-agent ,同一个项目里出现两套 HTTP 栈,错误处理和超时语音都要重写一遍。要先确认这不是唯一的路。
这篇文章对您有帮助吗?
订阅66必读
每日精选科技资讯,直达你的邮箱