我正在构建一个打字稿应用程序,它依赖 DyDx v4-client 作为 Node 模块 1,它本身依赖 Axios 来发出 HTTP 请求。 我在公司代理后面,Axios 无法提出任何请求。 例如,当尝试 GET https://indexer.v4testnet.dydx.exchange/v4/time 时,输出为
Error: getaddrinfo ENOTFOUND
。但它可以通过网络浏览器运行,所以我知道它没有被公司防火墙阻止。
由于 Axios 有点“埋藏”为 DyDx 的一个模块(它本身就是一个模块),所以我无法在代码中直接显式访问它。于是我尝试直接修改编译好的JS文件中的
request
函数来手动添加我的代理参数:
function request(url, method, body, headers) {
return axiosRequest({
url,
method,
data: body,
headers,
proxy: {
protocol: 'http',
host: 'foo.bar',
port: 1234
}
});
执行此操作时,Axios 会向我抛出以下 HTML 页面错误。该页面由防火墙生成。就像防火墙将 Axios 调用解释为浏览器调用一样...
Handshake failed
The SSL handshake could not be performed.
Host: service.iwanttoaccess.com
Reason: Can't initialize server context:handshakefailed:server state 1:state 9:Application response 500 handshakefailed
当我无法直接访问 Axios 时,如何正确设置代理参数?
axiosRequest
中使用的 Axios 实例,并且不公开它。这通常是一种糟糕的设计,因为它可能会导致像这样的问题。
在这种情况下解决此问题的方法是通过在 package.json 中覆盖它来强制库使用与项目相同的 Axios 实例:
"dependencies": {
"axios": "1"
},
"overrides": {
"@dydxprotocol/v4-client-js": {
"axios": "$axios"
}
}
然后可以通过导入
axios
并更改axios.defaults
来修改全局Axios配置。
该库使用特定的 Axios 版本,可能与项目中使用的版本不兼容。在这种情况下,可以同时安装多个版本,因此库使用的版本可以以不同的名称导入到项目中。