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

scr*_*key 8 heroku node.js

我在Heroku中运行一个简单的测试站点时遇到了麻烦.出于某种原因,当我希望它从/ build /服务时,它正试图从/ app/build /提供内容.

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

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

process.env.PWD = process.cwd();
Run Code Online (Sandbox Code Playgroud)

但它没有用.下面是我的server.js表达app和文件夹结构

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');
Run Code Online (Sandbox Code Playgroud)

目录结构

hun*_*tis 22

首先,不要使用PWD.只需使用__dirname.它适用于Heroku,就像它在任何其他地方一样.例如,如果您从非本地目录执行二进制文件,则使用PWD会使您的应用程序更加脆弱.

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

最后,ENOENT说/ app/build的原因只是因为Heroku上的root/home目录是/ app.永远不要构建锁定在绝对文件结构中的应用程序; 只使用相对路径(否则,如果您将应用程序移动到本地计算机上的另一个目录,您的应用程序将会中断).

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

  • 我找到了答案.我的.gitignore忽略了build文件夹.我觉得这么傻.我接受了你的回答,因为它对其他有类似问题的人最有帮助.非常感谢 :) (10认同)

小智 7

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

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

  1. 在你的app文件夹里面的命令行中运行heroku run bash
  2. 输入目录并输入.然后你会看到文件夹和文件列表