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

时间:2016-09-16 15:51:11

标签: node.js heroku

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

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

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

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

但它没有用。下面是我的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');

directory structure

10 个答案:

答案 0 :(得分:20)

首先,不要使用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);
});

答案 1 :(得分:7)

忽略

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

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

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

答案 2 :(得分:4)

检查你的package.json文件

"postinstall": "ng build --aot --prod"

检查您的server.js文件

const express = require('express');
const path = require('path');
const app = express();

app.use(express.static(__dirname + '/dist/YOURPROJECTNAME'));
app.get('/*', function(req,res) {
res.sendFile(path.join(__dirname + '/dist/YOURPROJECTNAME/index.html'));

});

app.listen(process.env.PORT || 8080);

答案 3 :(得分:2)

使用以下内容添加静态文件位置

app.use(express.static('build'));

Express查找相对于静态目录的文件,因此静态目录的名称不是URL的一部分。您应该能够这样做以获得index.html:

app.get('*', function (req, res) {
  res.sendFile('index.html');
});

请参阅https://expressjs.com/en/starter/static-files.html

答案 4 :(得分:1)

我遇到了类似的问题,Heroku open一直抱怨在index.html内部缺少/app。但是,它在本地'Heroku Local'上运行良好。

问题是我明确忽略了编译文件/文件夹,例如/dist文件中的gitignore,因此从未将/dist推送到部署的heroku文件夹中。

heroku git bash
dir

并确保您在此处列出了dist folder (with compiled files),并且一切正常。

答案 5 :(得分:0)

请注意,最好在脚本中使用heroku-postbuild命令,而不要推送build文件夹。

"scripts": {
  "start": "node index.js",
  "heroku-postbuild": "cd client && npm install && npm run build"
}

答案 6 :(得分:0)

我遇到了同样的问题,但是我已经做好了一切。 Heroku Post构建在我的节点package.json文件中。 见下文

"scripts": {
  "start": "node index.js",
  "heroku-postbuild": "cd client && npm install && npm run build"
}
  • 仍然出现错误 错误:ENOENT:没有这样的文件或目录,stat + app / client / build / index.html'

仅发现发生这种情况是因为在我的react文件夹index.js文件中 请看下面

import React from 'react';
import ReactDom from 'react-dom'
import App from './App' #importing the App.js component

ReactDom.render(<App/>, document.getElementById('root')) 
// render the react app

但是我没有导出App.js组件,因此,当我部署到heroku时,文件没有被拾取。

这是用于导出我的App组件的行

export default App;
  • 希望这对某人有帮助。

答案 7 :(得分:0)

在具有dokku的vps上部署React App时,我遇到了同样的问题。

我已使用与上述相同的方法修复了它,但您需要在终端机中将npm run build"scripts"一起放入package.json中,例如:

"scripts": {
    "start": "node server.js",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject",
    "heroku-postbuild": "npm install && npm run build"
  },

然后在.gitignore中添加/ build文件夹。 现在,在继续使用master之前先删除"build": "react-scripts build",(与"heroku-postbuild"发生冲突)。

答案 8 :(得分:0)

我对Angular和node也有同样的问题。这是因为我的dist文件夹未包含在存储库中,所以您可以在角度应用程序中更改.gitignore,或者将dist文件夹复制到另一个位置。然后从server.js或app.js引用它

答案 9 :(得分:0)

我也遇到了这个问题,最后我找到了解决方案。

我犯的错误: 该文件在 Heroku 上不存在的原因可能是因为我已将其添加到 .gitignore 文件中,即 /build 文件夹。所以 index.html 没有被签入到 git。

解决办法: 只需从 .gitignore 中删除 /build 文件夹,它就最终工作