【问题标题】:Using Create-React-App with Express in production在生产环境中使用带有 Express 的 Create-React-App
【发布时间】:2019-12-23 23:21:41
【问题描述】:

如何在生产模式下将我的 react-app 与 express 一起使用? 目前我在一个终端调用yarn run start,在另一个终端调用node server.js

这在开发模式下工作得很好。我在 package.json (http://localhost:8080) 中添加了"proxy"

问题是我不知道如何让它在实时模式下工作。 我只是打电话给yarn build,但是现在服务器正在运行是没有意义的;-)

我可以用简单的方法解决这个问题吗?

一些代码:

package.json

"proxy": "http://localhost:8080"

server.js

const app = express();
app.post("/checkout", async (req, res) => {
  ...
});
app.listen(8080);

在 react-app 中,我使用 axios 将数据发布到此 API。

我在开发模式下得到/想要什么:

来自 API 的正确响应。

我想要的产品模式:

来自 API 的正确响应。

我在 prod 模式下得到的结果:

错误:404(在我看来,因为服务器没有运行)

文件夹结构:

my-app
├── build
├── node_modules
├── public
│   ├── favicon.ico
│   ├── data
│   ├── index.html
│   └── manifest.json
├── scripts
│   ├── build.js
│   ├── start.js
├── src
│   ├── components
│   │     Component1.js, Component2.js, ...
│   ├── App.js
│   ├── index.css
│   ├── index.js
│   └── serviceWorker.js
├── .gitignore
├── package.json
├── server.js
└── README.md

我可以使用 netlify 的 Lambda 函数解决这个问题吗?

这是服务器脚本: server.js

const express = require("express");
const ... require(...);

const app = express();

app.post("/checkout", async (req, res) => {
  console.log("Request:", req.body);

  let error;
  let status;
  try {
    const { token } = req.body;

    const var1 = await stripe.customers.create({
      ...
    });

    const idempotency_key = uuid();
    const charge = await stripe.charges.create(
      {...}
    );
  }

  res.json({ ... });
});

app.listen(8080);

其他方式:是否可以在 php 服务器上运行结帐 api?

【问题讨论】:

  • yarn build 将为您提供应用程序的生产版本,而不涉及server。您的服务器必须正在运行,我建议您部署它。
  • 请分享您的项目文件夹结构。
  • 感谢您的回答!我怎样才能做到这一点?我使用 netfliy 使用 build 命令发布我的 react 应用程序:yarn build 文件夹结构:ibb.co/KV6RpXp
  • 您将需要使用 Netlify Lambda 函数或将您的 API 托管在另一台服务器上。所有这些试图解决部署在服务器上的 React 应用程序的答案都不理解 Netlify,只是令人困惑。 Netlify 在已部署的站点上运行服务器。如果您可以显示 server.js 的代码和它使用的任何代码,它会更容易回答。
  • 我更新了问题并添加了 server.js 代码。非常感谢您的帮助。

标签: reactjs express create-react-app netlify


【解决方案1】:

运行以下命令进行生产构建

npm run buildyarn build

server.js 文件中添加以下行以将客户端/构建作为静态内容提供服务

  app.use(express.static(path.join(__dirname, 'build')));

然后在定义的所有其他api路由的末尾添加下面的路由,这将发送索引文件

 app.get('/*', function (req, res) {
    res.sendFile(path.join(__dirname,'build', 'index.html'));
  });

【讨论】:

  • create-react-app 不在 root_dir_of_project/client 中。入口点在 /src/index.js
  • 请在您的问题中添加您的项目结构
  • 还有其他建议吗?
  • 谢谢,但在 netlify 上从不调用 node server.js。我想我不能这样做。你知道netlify吗?
【解决方案2】:

客户:
yarn build 是指 yarn run buildyarn run 将执行在package.jsonscripts 部分中指定的命令。在您的情况下,它将运行脚本文件夹中的 build.js 文件。通常,它将应用程序捆绑到静态文件中以进行生产。所以现在必须提供正在生成的静态文件。这部分现在是客户端。

{
  "scripts": {
    ...
    "build": "node scripts/build.js",
    ...
  }
}

服务器:
我建议您使用serve-staticexpress 提供静态文件。

  • yarn add serve-static安装它
  • 使用serverStatic(root,options),根目录将是您的静态文件目录,否则默认发送index.html 文件。

来自docs,这可以简单地使用:

var express = require('express')
var serveStatic = require('serve-static')

var app = express()

app.use(serveStatic('public/ftp', { 'index': ['default.html', 'default.htm'] }))
app.listen(3000)

您还可以查看其他变体here

要在 Heroku 上部署您的项目,请关注 this

【讨论】:

  • 我认为 server.js 永远不会被调用?不是吗?
  • 这些是sever.js 中的编辑。服务器应该正在运行。
  • 关于public\ftp,这是一个例子。将其替换为您的目录,它将是您的静态文件所在的 build
  • 好的,所以我的静态文件在构建文件夹中 (build/index.html,...) 所以我这样做了:app.use(serveStatic('build/', { 'index': ['index.html'] })) -> 没有变化,是 404
  • 我可以在 server.js 中更改我想要的任何内容。没有错误等。如何检查服务器是否正在运行?
猜你喜欢
  • 2018-09-26
  • 2018-09-07
  • 2020-06-23
  • 2018-05-22
  • 1970-01-01
  • 2018-11-12
  • 2021-02-28
  • 2022-06-18
  • 2018-04-07
相关资源
最近更新 更多