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

时间:2018-06-27 03:49:59

标签: node.js http cors axios

我正在使用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服务器允许我使用。

1 个答案:

答案 0 :(得分:3)

事实证明,jsdom是发出源localhost并阻止跨域请求的人。通过https://github.com/axios/axios/issues/1180,我得以解决自己的问题。在测试套件中,将此代码放置在axios的任何HTTP请求之前:

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

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