如何优雅地使用 Axios 配置代理 —— 实战与坑点总结
在日常开发中,Axios 是我们最常用的 HTTP 客户端之一。不管你是在写 Node.js 后端脚本,还是前端爬虫工具,有时候我们都需要通过代理去访问一些资源(比如科学上网、突破 IP 限制等)。
今天我们就聊聊:Axios 如何配置代理,以及你可能会踩的那些坑。
1. 为什么需要代理?
举个例子,你的程序要访问一个国外的网站,而这个网站在国内是无法访问的。怎么办?加代理!
再比如,有些网站会根据 IP 限制访问频率,或者只允许某个国家的用户访问。这时候,如果你有一个代理 IP,那就是你的“分身”——轻松绕过限制。
2. Axios 的代理配置方法
Axios 本身是支持代理的,官方文档也有说明。但不同的运行环境(Node.js vs 浏览器)处理方式是不一样的,我们逐一来看:
在 Node.js 中使用 HTTP/HTTPS 代理
这其实是最常见的用法,尤其是你在写 CLI 工具、爬虫、Telegram 机器人等等。
ts
import axios from 'axios';
import { HttpsProxyAgent } from 'https-proxy-agent';
const proxyAgent = new HttpsProxyAgent('http://127.0.0.1:7890'); // 替换成你的代理地址
const res = await axios.get('https://example.com', {
httpsAgent: proxyAgent,
proxy: false, // 一定要禁用 axios 自己的 proxy,不然会冲突!
});
console.log(res.data);
小贴士:
proxy: false
是重点!否则 axios 会优先使用自己的proxy
参数(后面会讲它的问题),导致httpsAgent
不生效。
axios 自带的 proxy 参数不好用?
你可能看到过这样的写法:
ts
axios.get('https://example.com', {
proxy: {
host: '127.0.0.1',
port: 7890,
},
});
看起来很清爽对吧?但问题是:
- 它只支持 HTTP 协议的代理;
- 不支持 HTTPS 或 SOCKS;
- 有时候在某些 Node.js 版本下会不生效;
- 它其实是基于老旧的
http-proxy-agent
实现的,灵活性差。
所以,不推荐这种写法。
正确做法:配合代理库(推荐)
用 https-proxy-agent
或 socks-proxy-agent
这样的库,灵活又靠谱。
ts
import axios from 'axios';
import { SocksProxyAgent } from 'socks-proxy-agent';
const agent = new SocksProxyAgent('socks5h://127.0.0.1:1080');
const res = await axios.get('https://google.com', {
httpsAgent: agent,
proxy: false,
});
- 支持 SOCKS5 / HTTPS / HTTP
- 支持认证(用户名密码)
- 与 axios 配合良好
3. 浏览器端能用代理吗?
不能,至少不是你想象的那种方式。
在浏览器里运行的 Axios 请求,走的是用户本地的网络环境,无法通过代码控制代理设置。如果你在浏览器开发者工具里设置了代理,是全局生效的,不是 Axios 的事。
所以,浏览器端想走代理,只能靠系统/浏览器插件的配置,或者后端转发。
4. 坑点总结
proxy: { host, port }
只支持 HTTP,别用它搞 HTTPS/SOCKS;- 用
httpsAgent
更稳定; - 不加
proxy: false
会导致代理无效; - 记得区分
httpAgent
和httpsAgent
,请求协议要匹配; - 浏览器端无法用 Axios 设置代理,别挣扎了;
5. 一个完整的代理请求封装
ts
import axios, { AxiosRequestConfig } from 'axios';
import { HttpsProxyAgent } from 'https-proxy-agent';
const useProxyRequest = async (url: string, config?: AxiosRequestConfig) => {
const proxy = process.env.PROXY || 'http://127.0.0.1:7890';
const agent = new HttpsProxyAgent(proxy);
return axios.get(url, {
...config,
httpsAgent: agent,
proxy: false,
});
};
6. 最后总结
- 如果你是在 Node.js 中使用 Axios,请使用
https-proxy-agent
这类库; - 避免使用 Axios 自带的
proxy
参数; - 浏览器端无法设置代理,靠服务端中转或浏览器配置;
- 配置代理时记得加
proxy: false
!