源自服务器端NodeJS/Axios/JSDOM的跨源HTTP请求

nxagd54h  于 2023-02-12  发布在  Node.js
关注(0)|答案(2)|浏览(117)

我正在使用Axios创建对不同域中的API服务器的HTTP请求。

  • API服务器允许来自http://localhost:3000的跨源请求。
  • 我无法控制API服务器。
  • 我的应用程序通常在http://localhost:3000中运行,并从浏览器发出请求。

到目前为止还没有问题。跨源请求工作正常。但是,最近我想为那些API调用添加一个单元测试。这个测试环境是jsdom,因为我使用的是Jest。这在我从服务器端创建HTTP请求时产生了一个问题,源被设置为http://localhost,这是服务器不允许的。
使用Axios发出请求:

axios.post(`${API_DOMAIN}/member/account/login`, {
  username,
  password,
}, {
  headers: {
    Origin: 'http://localhost:3000'
  }
})

不过,回复还是说
error: Cross origin http://localhost forbidden
如何将我在jsdom下使用Axios创建的HTTP请求的“来源”更改为http://localhost以外的其他名称?我需要将其更改为http://localhost:3000,以便API服务器允许。

c6ubokkw

c6ubokkw1#

原来jsdom是发起源localhost并阻止跨源请求的人。从https://github.com/axios/axios/issues/1180中我能够解决我的问题。在测试套件中,将以下代码放在axios的任何HTTP请求之前:

axios.defaults.adapter = require('axios/lib/adapters/http')

这将使Axios使用NodeJS的HTTP适配器而不是JSDOM的XMLHttpRequests,这样就不会有跨源问题。

tktrz96b

tktrz96b2#

补充@Arkross的回答,
axios/lib/adapters/http不被封装暴露。
相反,您可以执行以下操作:

axios.defaults.adapter = 'http'

// or

axios.request({
  adapter: 'http',
  ...
})

相关问题