背景

在调试 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.requestundici(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 界面下载并信任根证书。