node.js中axios请求不走代理的主因是默认不读取系统代理环境变量,必须显式设置http_proxy/https_proxy;vscode调试需在launch.json中配置env字段注入,且须禁用tls校验并确保响应拦截器返回promise.reject才能触发断点。

Node.js 中 axios 请求不走代理的常见原因
VSCode 调试时 axios 发起的请求没被 mitmproxy 或 Charles 拦截,大概率不是工具没开,而是 Node.js 进程根本没把流量发过去。Node.js 默认不读系统代理设置,axios、node-fetch 等库也不会自动继承 HTTP_PROXY 环境变量 —— 除非你显式配置。
- 必须在启动前设置环境变量:
process.env.HTTP_PROXY = 'http://127.0.0.1:8080'(注意是小写http_proxy在某些 shell 下也生效,但 Node.js 官方文档明确推荐大写) - 若用
https请求,还需同时设HTTPS_PROXY,否则会被跳过 -
launch.json中的env字段只影响调试进程,不影响子进程或 fork 出的 child_process,所以要在入口文件顶部尽早赋值 - 某些库(如
got)默认支持代理,但axios不支持,必须靠环境变量或手动传proxy配置项
在 launch.json 中正确注入代理环境变量
VSCode 的 Node.js 调试器不会自动转发系统代理设置,必须通过 launch.json 显式注入。直接写死在代码里虽可行,但不利于多环境切换。
- 打开项目根目录下的
.vscode/launch.json,确保配置了env字段,例如:
{
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch with proxy",
"program": "${workspaceFolder}/index.js",
"env": {
"HTTP_PROXY": "http://127.0.0.1:8080",
"HTTPS_PROXY": "http://127.0.0.1:8080",
"NODE_TLS_REJECT_UNAUTHORIZED": "0"
}
}
]
}
NODE_TLS_REJECT_UNAUTHORIZED: "0" 是必须的 —— mitmproxy 使用自签名证书,Node.js 默认拒绝,不关掉会报 certificate has expired 或 self signed certificate
os.environ 或 process.env 在代码中动态读取再设置;launch.json 的 env 是最可靠、最易复现的方式axios 响应拦截器捕获 404/500 但不触发断点的真相
你在 axios.interceptors.response.use 里写了 debugger 或打了断点,却从不命中?不是代码没执行,而是拦截器运行在 Promise 链内部,VSCode 默认不进入异步回调栈 —— 尤其当错误被 .catch() 吞掉后,调用栈就断了。
根据 package.json 中的 engines 字段自动检测 Node.js 版本需求,未安装 nvm 时自动安装并切换至对应版本。支持 Windows、macOS、Linux。适用于 Node.js 项目开发、版本切换和环境配置。
- 确保响应拦截器的 error 回调也返回
Promise.reject,否则错误会被静默吞掉:
axios.interceptors.response.use(
response => response,
error => {
console.error('API failed:', error.response?.status);
debugger; // 这里能停住的前提是下面这行存在
return Promise.reject(error); // 缺少这句,断点永远不会触发
}
);
try/catch 包裹 await axios.get(...),那错误根本不会冒泡到拦截器的 error 回调,而是在 catch 块里被处理 —— 此时应在 catch 内部打断点node_modules/axios 内部逻辑;可在设置中关闭 debug.javascript.autoAttachFilter 或启用 trace: true 查看完整调用流模拟后端异常并验证拦截逻辑的最小闭环
真正卡住人的不是写拦截器,而是“怎么确认它在真实异常下真起了作用”。靠改后端代码太重,用代理工具模拟更轻量、可复现。
- 启动
mitmproxy:终端运行mitmproxy --mode upstream:http://localhost:3000 --set block_global=false(假设后端跑在 3000 端口) - 在 VSCode 中用 REST Client 插件发一个测试请求,开头加
@proxy = http://127.0.0.1:8080,然后发GET http://api.example.com/fail - 在 mitmproxy 界面选中该请求 → 按
m→ 选status code→ 输入500,回车即返回伪造错误 - 此时 Node.js 进程收到 500 响应,触发
response.use的 error 分支,断点才能真正落地 - 注意:若 axios 配置了
validateStatus: () => true,则所有状态码都会进 success 分支,404/500 不会进 error 回调 —— 这是容易忽略的隐性开关
真正要盯住的只有三处:环境变量是否注入、TLS 是否禁用、拦截器 error 回调是否抛出。其余都是干扰项。










