背景
在调试 Node.js 服务的 HTTP 请求时,想用 Whistle 抓包,最快的方式是通过环境变量注入代理配置。
方法:环境变量注入代理
在启动命令前设置以下三个环境变量:
HTTPS_PROXY=http://127.0.0.1:8899
HTTP_PROXY=http://127.0.0.1:8899
NODE_TLS_REJECT_UNAUTHORIZED=0
其中 NODE_TLS_REJECT_UNAUTHORIZED=0 是为了跳过 HTTPS 证书校验,否则 Whistle 的中间人证书会导致请求报错。
局限性
这种方式只对尊重标准代理环境变量的 HTTP 客户端生效,比如 axios。
Node 原生 https.request 和 undici(Node 18+ 内置 fetch)不读取这两个环境变量,请求不会走代理,Whistle 也抓不到。
全局强制代理(推荐)
如果需要拦截所有请求(包括原生 https 模块),使用 global-agent:
npm install global-agent
在入口文件最顶部加一行:
import 'global-agent/bootstrap';
然后通过 GLOBAL_AGENT_HTTP_PROXY 环境变量启动服务,它会 monkey-patch Node 的 http/https 模块,所有请求都走代理。
alias 写法
可以把代理变量直接写进 alias,这样每次启动服务自动带上代理,不需要手动 export:
daemon() {
HTTPS_PROXY=http://127.0.0.1:8899 \
HTTP_PROXY=http://127.0.0.1:8899 \
NODE_TLS_REJECT_UNAUTHORIZED=0 \
node your-app.js "$@"
}
函数内置变量只在该命令的环境中生效,不会污染当前 shell 的全局环境。
Whistle 安装与启动
npm install -g whistle
w2 start
启动后访问 http://127.0.0.1:8899 打开控制台。HTTPS 抓包还需要在 Whistle 界面下载并信任根证书。
