Open ChuChencheng opened 1 year ago
NestJS 应用内部请求了外部的 HTTP API ,由于某些原因需要代理。由于 NestJS 的 HttpModule 内部使用的是 axios ,因此直接找到官网搜 proxy 。
HttpModule
axios
本篇重点记录使用环境变量的方式,可不修改代码。
在其官方文档中,说明了两种配置代理的方式:
proxy
http_proxy
https_proxy
no_proxy
第一种方式比较明确,在 NestJS 中,在引入 HttpModule 时使用 register 传入配置即可
register
HttpModule.register({ proxy: {}, })
但是这种配置方式直接侵入了代码,怎么说都得再发个版,不如看看用环境变量如何解决。
在 Axios 官网中看到的三个环境变量,有许多工具跟语言都支持,例如 curl, Go 等。
不过这几个环境变量没有一个固定的标准,因此各个程序对它们的支持略微有些差异。
例如在这篇文章中,就讲述了由于 Ruby 跟 Go 对于 no_proxy 支持上的差异而导致的问题:
We need to talk: Can we standardize NO_PROXY?
不过在此我只记录如何在 NestJS 应用中配置,就不去深究它们之间的差异了。
在 package.json 中可以看到这么一个库用于读取 proxy 环境变量:
package.json
proxy-from-env
可以看到这个库支持 http_proxy, https_proxy, no_proxy 和 all_proxy (实际上是取了 ${protocol}_proxy ,因此 ftp, ws 之类的协议也是支持的,只要 Axios 能请求)
all_proxy
${protocol}_proxy
ftp
ws
对于大小写的环境变量都支持了,且优先小写,可见代码
看到这里,配置方式很明确了,按需加上 http_proxy 等环境变量即可,例如:
http_proxy=http://username:password@example.com:8080 https_proxy=http://username:password@example.com:8080
对应 axios 中的 proxy 配置:
proxy: { protocol: 'http', host: 'example.com', port: 8080, auth: { username: 'username', password: 'password' } }
优点:
缺点:
背景
NestJS 应用内部请求了外部的 HTTP API ,由于某些原因需要代理。由于 NestJS 的
HttpModule
内部使用的是axios
,因此直接找到官网搜 proxy 。本篇重点记录使用环境变量的方式,可不修改代码。
Axios 配置代理
在其官方文档中,说明了两种配置代理的方式:
proxy
配置http_proxy
,https_proxy
,no_proxy
环境变量第一种方式比较明确,在 NestJS 中,在引入
HttpModule
时使用register
传入配置即可但是这种配置方式直接侵入了代码,怎么说都得再发个版,不如看看用环境变量如何解决。
Proxy 环境变量
在 Axios 官网中看到的三个环境变量,有许多工具跟语言都支持,例如 curl, Go 等。
不过这几个环境变量没有一个固定的标准,因此各个程序对它们的支持略微有些差异。
例如在这篇文章中,就讲述了由于 Ruby 跟 Go 对于
no_proxy
支持上的差异而导致的问题:We need to talk: Can we standardize NO_PROXY?
不过在此我只记录如何在 NestJS 应用中配置,就不去深究它们之间的差异了。
Axios 中对 http_proxy 等环境变量的支持
在
package.json
中可以看到这么一个库用于读取 proxy 环境变量:proxy-from-env
可以看到这个库支持
http_proxy
,https_proxy
,no_proxy
和all_proxy
(实际上是取了${protocol}_proxy
,因此ftp
,ws
之类的协议也是支持的,只要 Axios 能请求)对于大小写的环境变量都支持了,且优先小写,可见代码
NestJS 配置正向代理
看到这里,配置方式很明确了,按需加上
http_proxy
等环境变量即可,例如:对应
axios
中的proxy
配置:优缺点
优点:
缺点:
http_proxy
环境变量读取的差异,比如支持情况,大小写等