React / Express - 错误:ENOENT:没有这样的文件或目录,stat '/app/build/index.html'

时间:2021-01-21 18:01:57

标签: node.js reactjs express heroku

请查看下面的修改 请让我摆脱这里的痛苦。我花了几个小时浏览文档并尝试在此站点上找到的不同方法。从 github 中提取代码后,heroku 尝试构建时出现此错误:

错误:ENOENT:没有那个文件或目录,stat '/app/build/index.html'

我在 root 中有我的客户端代码,在 /server 中有我的快速服务器代码。
节点正在从根 package.json 启动(例如节点服务器/index.js)。
如果我 bash 进入 heroku,我可以看到 /build/index.html 文件。

app.use(express.static(path.resolve(__dirname, '../build')));
app.get('*', (req, res) => {
  res.sendFile(path.resolve('build/index.html'));
});

编辑

还有一些奇怪的东西。如果我像这样设置路径,我可以在 localhost:5000 上的 /build 文件夹中浏览我的图像(与 root 相同的路径),但我仍然在 prod 中遇到相同的错误。

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

enter image description here

编辑 2:
事实证明,我需要添加一个对“public”的静态引用。啊!
我现在可以在构建目录中看到 index 和其他任何内容。
但是,没有对构建期间创建的 static/js 文件的引用,因此页面为空。我可以在服务器上的 bash 提示符下看到它们。

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

app.use((req, res, next) => {
  res.sendFile(path.join(__dirname, '..', 'build', 'index.html'));
});

2 个答案:

答案 0 :(得分:0)

我从来没有发现过这个问题,所以我把它缩小了,再试一次。最终,我认为您甚至不需要引用 index.html 文件。在根级别我有 server.js。在该文件中,我只是在我的路由文件之后引用客户端/构建,这作为路由中未找到的任何内容的默认值:

app.use(express.static("client/build"));

答案 1 :(得分:0)

我希望这能帮助其他人解决这个问题。本周我遇到了这个错误并解决了它。就我而言,它与 client/build/index.html 路径无关。我敢打赌,你的情况也是一样。

请耐心等待,先通过以下几点来了解问题出在哪里:

问题在于,当您创建 React 应用程序时,它会以某种方式自动运行 git init 命令。您最终会得到 2 个 git 文件夹:一个用于 Express 后端,另一个用于您的 react 客户端文件夹。 结果是,当您提交更改时,客户端文件夹中的更改不会被推送到 heroku。

要让自己相信是这种情况,请在项目根目录下的终端中运行以下命令:

a) heroku run bash

b) cd into the client folder

c) ls client

如果在此阶段您没有看到客户端文件夹的内容,那么这就是导致问题的首要原因。

现在是补救措施:

转到您的终端并运行这些命令(归功于:Content of create-react-app is not pushed in github

mv client subfolder_tmp
git submodule deinit client
git rm --cached client
mv subfolder_tmp client
git add client

现在在您的客户端文件夹中进行更改,然后将它们推送到 heroku (git add . , git commit -m "", git push heroku master)

如果这有帮助,请告诉我,我知道我通过这种方式解决了我的问题。