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

Posted

技术标签:

【中文标题】源自服务器端 NodeJS/Axios/JSDOM 的跨域 HTTP 请求【英文标题】:Cross-Origin HTTP Request originating from server-side NodeJS/Axios/JSDOM 【发布时间】:2018-12-05 20:21:06 【问题描述】:

我正在使用 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】:

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

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

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

【讨论】:

你拯救了我的一天。谢谢 为我工作,谢谢! 这很好用。我尝试将 testEnvironment: 'node' 添加到我的 jest.config.js 中,这也有效

以上是关于源自服务器端 NodeJS/Axios/JSDOM 的跨域 HTTP 请求的主要内容,如果未能解决你的问题,请参考以下文章

使用 Rust 构建 gRPC 服务器

服务器 java后端技术学习路线图 初阶+中阶+高阶

20161124网络爬虫技术学习

Web后端开发工程师技能进阶路线图2018 版

关于 浏览器中的 cookie 与 session 的相关阐述

趣图 | 前后端分离开发