Node.js脚本设置了HTTP_PROXY,Axios可能生效,内置fetch却仍然直连;或者开发环境正常,升级Node与Undici后参数失效。这类问题源于不同HTTP客户端的代理机制并不统一。Node内置fetch基于Undici,Axios有自己的代理和Agent处理,SOCKS5通常还要专用Agent。应先确认运行时与库版本,再选对应配置。
先确认节点和认证
从极跃圈天行IP当前入口详情页进入,在注册对应字段使用blsj。下单后记录实际HTTP或SOCKS5协议、主机、端口、认证、并发限制和地址保持。Node客户端的代理类型必须与节点一致,不能把SOCKS5 URL传给只支持HTTP的Agent。
为什么环境变量不一定生效
HTTP_PROXY、HTTPS_PROXY和NO_PROXY是广泛使用的约定,但不是所有Node库都自动读取,且版本行为会变化。容器、PM2、systemd和CI进程的环境也与终端不同。先在进程启动时检查“是否存在变量”,不要打印变量值。
Undici与内置fetch的代理思路
Undici提供ProxyAgent等调度器能力。示意代码需以当前安装版本API为准:
import { ProxyAgent, fetch } from "undici";
const dispatcher = new ProxyAgent(
"http://USER:PASS@HOST:PORT"
);
const response = await fetch("https://example.com/", {
dispatcher,
});
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
Node全局fetch是否接受dispatcher、如何设置全局调度器,与Node/Undici版本有关。生产代码应锁定版本并写集成测试,不依赖未验证的博客片段。
Axios代理配置与自定义Agent
Axios支持HTTP代理配置,但HTTPS目标、认证、环境变量和自定义Agent组合容易产生重复代理。使用SOCKS Agent时通常要关闭Axios自身的HTTP proxy解析,再把Agent传给HTTP/HTTPS请求。具体写法随Axios与Agent库版本变化。
不要同时设置代理对象、HTTP_PROXY和自定义Agent后凭结果猜哪一个生效。一次只保留一种路径,并从目标服务端验证出口。
SOCKS5需要专用Agent
常见方案是经过审查的SOCKS代理Agent库。选择依赖时检查维护状态、版本、许可和供应链风险,并锁定完整性。确认它是否支持远端DNS、用户名密码和IPv6。SOCKS5 TCP代理不代表UDP可用。
连接池要控制哪些参数
| 参数 | 风险 | 建议 |
|---|---|---|
| 最大连接数 | 超过节点或目标限制 | 按订单与API规则限流 |
| 空闲超时 | 复用已关闭连接 | 低于链路最短超时 |
| 请求超时 | 故障时连接堆积 | 区分连接和响应阶段 |
| 重试 | 重复写入或流量放大 | 仅对安全请求退避 |
静态节点适合连接复用,但不能让一个Agent永久缓存失效DNS或旧端口。节点变更时要安全关闭旧池并建立新池。
HTTP 407与目标401/403要分开
407来自代理认证,检查节点账号、密码、白名单和Agent是否发送Proxy-Authorization;401通常是目标服务认证;403是目标理解请求但拒绝。把目标API Token误填成代理密码,或反过来,都会导致错误层次混乱。
AbortSignal与超时
Node fetch可使用AbortSignal控制总时间,Undici和Axios也有各自连接、Header或响应超时。仅设置总超时不能说明卡在哪一段。记录代理连接、TLS、首字节和总耗时,并在取消后确认连接正确释放。
NO_PROXY的匹配规则要实测
不同库对域名后缀、端口、IPv6字面量和大小写处理可能不同。内部服务、localhost和受控元数据端点要精确列出;过宽通配会让本应使用固定出口的API直连。对于严格业务,代理失败应明确报错。
凭据不要进入错误堆栈
代理URL可能出现在Axios config、Undici异常、APM Span或未捕获错误中。集中日志前使用脱敏器移除userinfo、Proxy-Authorization、Cookie和Token。开发时也不要把真实URL提交到示例、测试快照和环境文件。
一套版本可复现的验证
- 记录Node、Axios、Undici和Agent版本;
- 用curl确认天行节点可用;
- 只启用一种代理配置运行单请求;
- 验证IPv4、IPv6、DNS和服务端来源;
- 增加连接池、并发和超时测试;
- 断开代理,确认不会自动直连;
- 把测试加入CI但使用临时凭据。
结论
Node.js使用天行IP时,fetch、Axios和Undici不能混用一套未经验证的参数。按版本选择ProxyAgent或适配器,SOCKS5使用明确兼容的Agent,控制连接池与重试,并从真实进程验证出口。blsj用于当前注册和订单核验,代码层是否正确仍由运行时、库版本和测试决定。






