让 Undici 读取代理环境变量
主动使用 EnvHttpProxyAgent,分清小写优先级、绕过规则,以及构造时固定的代理 URL 与动态 no_proxy 设置。
如果希望由进程环境选择路径,就用 EnvHttpProxyAgent;如果端点应属于客户端配置,则用显式的 Undici ProxyAgent。要把它传给实际请求,仅创建 agent 不会改变任何 fetch 调用:
import { EnvHttpProxyAgent, fetch } from 'undici';
const dispatcher = new EnvHttpProxyAgent();
try {
const response = await fetch("https://example.com/", {
dispatcher,
signal: AbortSignal.timeout(15000),
});
console.log(response.status);
await response.arrayBuffer();
} finally {
await dispatcher.close();
}在可使用 Undici 的 ES 模块环境中,将代码保存为 proxy-check.mjs。下面的 POSIX 启动方式提供两种代理路径,并清空绕过列表:
http_proxy=http://203.0.113.10:8080 \
https_proxy=http://203.0.113.10:8080 \
no_proxy= \
node proxy-check.mjs将文档示例端点换成自己的 HTTP 代理,或HTTP 代理列表中的候选。这些赋值只作用于本次调用,其他 shell 的语法不同。
Undici 8.12.3 中,小写的 http_proxy、https_proxy 和 no_proxy 与对应大写变量同时存在时,小写优先。HTTP 和 HTTPS 目标各用各的设置。只有 HTTP 设置时也可作为 HTTPS 的回退;只有 HTTPS 设置时不会为 HTTP 提供代理。不要假定其他客户端的 ALL_PROXY 约定在这里也适用。
| 输入 | 这个版本何时读取 |
|---|---|
| HTTP/HTTPS 代理环境变量 | 构造 agent 时选定。修改这些端点后,应创建新的 dispatcher。 |
环境中的 no_proxy | 分发请求时会再次检查。 |
构造参数 noProxy | 显式固定绕过策略,不再跟随之后的环境变化。 |
绕过规则可匹配主机和可选端口;单独一个星号会绕过所有请求。代理看不到流量时,应检查目标是否命中了绕过规则。
Windows 主进程处理环境变量名称时不区分大小写,因此 HTTP_PROXY 和 http_proxy 不是独立的值。Node Worker 的环境副本则有文档说明的大小写区分。设置两种拼写来测试优先级前,要考虑这一区别。示例在任务结束后关闭 dispatcher;若连续请求需要相同的已固定端点策略,就应在此期间保留它。