我在ECS上实施了一个全栈应用程序,启用了服务发现.该基础设施包括一个与MySQL RDS数据库对话的后端和一个向NodeJS后端发出请求的VueJS前端.当我向前台提出请求时,遇到了CORS问题.要重现该问题:

  1. 克隆https://github.com/FIAF0624/backend-infra

  2. TerraForm初始化

  3. TerraForm计划

  4. 应用TerraForm

  5. 当MySQL实例启动并运行时,使用mysql -h <endpoint> -u admin -padmin123连接到数据库并运行以下查询:

    如果存在客户,则丢弃数据库;

    创建数据库客户; 使用客户; 如果存在图书,则丢弃表格;

    创建表格手册( ID int不为空AUTO_INCREMENT, 名称varchar(255)非空, 价格int不为空, 主键(Id) );

    在书中插入价值观(1,《基础经济学》,20),(2,《哈利波特》,15),(3,《物理学》,17); 从书籍中 Select *

  6. 克隆https://github.com/FIAF0624/frontend-infra

  7. TerraForm初始化

  8. TerraForm计划

  9. 应用TerraForm

  10. 转到ecs-&gt;Rolling-ls-cluster-&gt;Tasks-&gt;在浏览器中输入公网IP,然后点击按钮.

  11. 判断浏览器控制台(右键单击-&>;判断-&>控制台),您将看到以下错误.

Access to XMLHttpRequest at 'api.example.terraform.com:3300/mysql' from origin 'http://<public-IP>' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, isolated-app, chrome-extension, chrome, https, chrome-untrusted.

GET api.example.terraform.com:3300/mysql net::ERR_FAILED
Uncaught (in promise) rt {message: 'Network Error', name: 'AxiosError', code: 'ERR_NETWORK', config: {…}, request: XMLHttpRequest, …}

但是,如果我创建一个EC2实例并使用 curl api.example.terraform.com:3300/mysql,我得到了回复.

这是我的NodeJS后端:https://github.com/FIAF0624/backend/blob/main/server.js,我还允许CORS显式地添加头部.安全组允许来自任何地方的所有流量.不知道为什么我会遇到这个CORS问题.这个应用程序在本地运行得很好.我不确定问题到底出在哪里.任何帮助都将不胜感激.

这是前端回购:https://github.com/FIAF0624/frontend/blob/a2e89010d3dfaa75caecfb8d656723abe2ff3456/src/components/Dashboard.vue#L29,我正在使用Axios提出请求.

推荐答案

问题是,前端并不负责向后端发出请求.它只支持Java脚本、Html和CSS.在这种情况下,发出请求的是浏览器.因此,您的浏览器/笔记本电脑不在后端所在的网络上.这就是您仍然能够从EC2服务器发出请求的原因.

解决方案:设置VPN服务器(OpenVPN或AWS VPN)与您的VPC网络交互.然后提出一个请求,它应该会奏效.或者,如果您不介意使用公共域名,也可以遵循Matt的解决方案.但请记住,并不是每个API都是面向公众的.

或者,您也可以通过代理服务器重新路由请求,在本例中,代理服务器可以是已驻留在同一网络中的EC2实例.

Node.js相关问答推荐

如何在Node js中从MongoDB获取特定数据,使用GET方法?

@nuxtjs/站点 map 错误提示:找不到包';NitroPack';

我的Node.js应用程序没有将Mongoose方法findByIdAndDelete作为函数进行检测

在编译时强制不缩小类型范围

Rest-Api动态图像路径和Express除非

为什么 docker 容器内的应用程序无法访问它自己的 API 端点?

在nodejs中为oauth请求创建和存储csrf令牌的最佳方法

未授权使用联合身份未授权用户角色从 Amplify graphQL 访问类型 Y 上的 X

错误 node :错误:绑定消息提供 16 个参数,但准备语句需要 15 个

看起来这段代码try GET 请求发送的值变为空白

为什么 $or 在带有正则表达式的mongoose 中不能正常工作

如何解决 npm install react-select failure with error : An unknown git error occurred, git@github.com :Permission denied (publickey)

为什么当我try req.logout() 时出现此错误?

响应发送 200 而不是 403

使用 WebSockets 有服务器成本吗?

node.js 是否支持yields ?

从 zip 文件在 AWS 中创建 lambda 函数

node --experimental-modules,请求的模块不提供名为的导出

react-native run-android 无法识别

用于轻松部署和更新的 Node.js 设置