Heroku ENOENT:没有这样的文件或目录,stat '/app/build/index.html'

新手上路,请多包涵

我无法在 Heroku 中运行一个简单的测试站点。出于某种原因,当我希望它从 /build/ 提供内容时,它试图从 /app/build/ 提供内容。

错误:ENOENT:没有这样的文件或目录,stat ‘/app/build/index.html’

在这里 读到不要在 express 应用程序中使用 __dirname,因为 Heroku 将其设置为 /app 并且我应该使用 process.cwd();

 process.env.PWD = process.cwd();

但它没有用。下面是我的 server.js express 应用程序和文件夹结构

const path = require('path');
const express = require('express');
const port = process.env.PORT || 8080;
const app = express();

process.env.PWD = process.cwd();

app.use(express.static(process.env.PWD + '/build'));

app.get('*', function (req, res) {
  const index = path.join(process.env.PWD, '/build/index.html');
  res.sendFile(index);
});

app.listen(port);
console.log('server_started');

目录结构

原文由 screenm0nkey 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 448
2 个回答

首先,不要使用 PWD。只需使用 __dirname。它在 Heroku 上的工作方式与在其他任何地方的工作方式完全相同。例如,如果您从非本地目录执行二进制文件,则使用 PWD 会使您的应用程序更加脆弱。

其次,该文件在 Heroku 上不存在的原因可能是因为您已将其添加到 .gitignore 文件中,或者通常没有将其签入 git。您可以从编辑器的颜色编码中看到这一点 - 所有签入 git 的文件都是白色的,被忽略的文件是灰色的(如 node_modules 目录和 build/bundle)。您的索引文件是红色的(不像签入的文件那样是白色的)。因此,当您 git push heroku master 时,您引用的那些文件不存在。

最后,ENOENT 之所以说 /app/build 只是因为您在 Heroku 上的根/主目录是 /app。永远不要构建锁定在绝对文件结构中的应用程序;只需使用相对路径(否则,即使您将其移动到本地计算机上的另一个目录,您的应用程序也会中断)。

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

原文由 hunterloftis 发布,翻译遵循 CC BY-SA 3.0 许可协议

dist 文件夹被忽略。因此 heroku 返回此错误。当您在 heroku 中列出您的应用程序文件时,您可以看到它丢失了。

如何在 heroku 中列出文件夹/文件

  1. 在应用程序文件夹内的命令行中运行 heroku run bash
  2. 键入 dir 并输入。然后你会看到文件夹和文件的列表

原文由 jasharbn 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题