Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 两个独立Heroku(节点后端和反应前端)之间的通信?_Node.js_Reactjs_Express_Heroku_Mern - Fatal编程技术网

Node.js 两个独立Heroku(节点后端和反应前端)之间的通信?

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

我正在创建的一个应用程序使用MERN堆栈(MySql、Express、React、Node)。前端和后端分别存储在2个独立的Githubs repo中,并托管在2个独立的Heroku实例上。前端和后端都成功部署到Heroku

问题是如何让前端和后端彼此通信?用户应该从调用后端的前端开始,还是从后端开始

我已经尝试将前端代理地址设置为后端的heroku链接,但是显然这个代理地址只在开发环境中使用。我尝试在前端添加一个服务器文件,这样可以消除“无效主机头”错误,但无法解决通信问题

以下是frontend package.json:

{
  "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可以包含在两者中。