Node.js 两个独立Heroku(节点后端和反应前端)之间的通信?
我正在创建的一个应用程序使用MERN堆栈(MySql、Express、React、Node)。前端和后端分别存储在2个独立的Githubs repo中,并托管在2个独立的Heroku实例上。前端和后端都成功部署到Heroku 问题是如何让前端和后端彼此通信?用户应该从调用后端的前端开始,还是从后端开始 我已经尝试将前端代理地址设置为后端的heroku链接,但是显然这个代理地址只在开发环境中使用。我尝试在前端添加一个服务器文件,这样可以消除“无效主机头”错误,但无法解决通信问题 以下是frontend package.json:Node.js 两个独立Heroku(节点后端和反应前端)之间的通信?,node.js,reactjs,express,heroku,mern,Node.js,Reactjs,Express,Heroku,Mern,我正在创建的一个应用程序使用MERN堆栈(MySql、Express、React、Node)。前端和后端分别存储在2个独立的Githubs repo中,并托管在2个独立的Heroku实例上。前端和后端都成功部署到Heroku 问题是如何让前端和后端彼此通信?用户应该从调用后端的前端开始,还是从后端开始 我已经尝试将前端代理地址设置为后端的heroku链接,但是显然这个代理地址只在开发环境中使用。我尝试在前端添加一个服务器文件,这样可以消除“无效主机头”错误,但无法解决通信问题 以下是fronte
{
"name": "healthy-front-end",
"version": "0.1.0",
"private": true,
"dependencies": {
"axios": "^0.19.0",
"express": "^4.17.1",
"materialize-css": "^1.0.0-rc.2",
"moment": "^2.24.0",
"react": "^16.8.6",
"react-datepicker": "^2.8.0",
"react-dom": "^16.8.6",
"react-modal": "^3.9.1",
"react-moment": "^0.9.2",
"react-router-dom": "^5.0.1",
"react-scripts": "3.0.1"
},
"scripts": {
"start": "react-scripts start",
"dev": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
"heroku-postbuild": "npm run build"
},
"proxy": "http://localhost:3001",
"eslintConfig": {
"extends": "react-app"
}
}
以下是backend server.js:
require('dotenv').config();
const express=require('express');
常量app=express();
const path=require('path');
const env=process.env.NODE|env | |“development”;
const reactConfig=require(path.join(_dirname,'/config/config.static.json'))[env];
const PORT=process.env.PORT | | 3001;
//在这里定义中间件
app.use(express.static(path.join(_dirname,reactConfig));//提供react文件
use(express.urlencoded({extended:true}));
使用(express.json());
应用程序使用(cors());
//提供固定资产
if(process.env.NODE_env===‘生产’){
应用程序使用(express.static('client/build'));
}
//路线
要求(“./控制器/路线”)(应用程序);
//启动API服务器
应用程序侦听(端口,()=>
console.log(`我不在heroku
中,但我知道,您需要的是一个反向代理(如nginx
),它将您的静态流量重定向到为dist
文件夹提供服务的前端
,以及为您的API端点提供服务的后端
)
或者,您也可以使用
express.static
,为express
应用程序中的dist
文件夹提供服务。但是,您需要想出一种方法,使前端
构建在后端
中可用。如果您将前端发布到npm
,您可以将其作为依赖项添加ncy.如果您的项目包含多个包,您可以使用f.e.lerna:构建一个可部署单元。然后不要为单个应用程序使用单独的heroku实例。如果它们在单独的heroku中使用,它们很可能不共享同一本地主机。您应该将后端部署到heroku,然后在某些环境变量中传递后端服务的urlice到前端服务。@MaciejTrojniarz谢谢。本地主机不是仅用于本地开发吗?好主意,我将寻找如何在.env文件中包含URL的示例。或者我将实际执行以下操作:将react捆绑包作为一些缩小的js/css资源发布(到任何服务CDN/S3/您的后端服务)然后我后端代码提供Index.html文件,该文件将指向这些文件,然后您可以为前端和api使用相同的路径,这将消除将url传递到后端的需要。感谢@MaciejTrojniarz,Index.html文件位于前端,托管在不同的Heroku url上。我不认为仍然需要传递将前端url添加到后端,以便提供index.html?我已经添加了config.static.json和config.js文件以及更新的server.js文件,以引用这两个添加的文件谢谢。我将寻找一种方法将前端发布到npm。如果可以这样做,那么听起来用户应该从后端heroku url开始。谢谢ain@MaciejTrojniarz。我正在尝试将heroku url/主机分开。我想有一个更好的问题:从前端主机开始链接到后端还是从后端开始更好?反之亦然。看起来两者都是可能的,因为.env可以包含在两者中。