当是模块的模块时向axios传递代理参数

问题描述 投票:0回答:1

我正在构建一个打字稿应用程序,它依赖 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 时,如何正确设置代理参数?

node.js typescript axios proxy
1个回答
0
投票

该库封装了它在

axiosRequest
中使用的 Axios 实例,并且不公开它。这通常是一种糟糕的设计,因为它可能会导致像这样的问题。

在这种情况下解决此问题的方法是通过在 package.json 中覆盖它来强制库使用与项目相同的 Axios 实例

  "dependencies": {
    "axios": "1"
  },
  "overrides": {
    "@dydxprotocol/v4-client-js": {
      "axios": "$axios"
    }
  }

然后可以通过导入

axios
并更改
axios.defaults
来修改全局Axios配置。

该库使用特定的 Axios 版本,可能与项目中使用的版本不兼容。在这种情况下,可以同时安装多个版本,因此库使用的版本可以以不同的名称导入到项目中。

© www.soinside.com 2019 - 2024. All rights reserved.