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

Posted

技术标签:

【中文标题】Heroku ENOENT:没有这样的文件或目录,stat \'/app/build/index.html\'【英文标题】:Heroku ENOENT: no such file or directory, stat '/app/build/index.html'Heroku ENOENT:没有这样的文件或目录,stat '/app/build/index.html' 【发布时间】:2017-01-24 22:09:14 【问题描述】:

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

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

我读到 here 不要在 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');

【问题讨论】:

您是否尝试使用__dirname 而不是process.env.PWD,我部署了一个站点 我最初尝试过,但它不起作用。我发现上面的链接说_dirname被映射到heroku中的'app'并尝试process.cwd()但它正在做同样的事情。 【参考方案1】:

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

【讨论】:

我找到了答案。我的 .gitignore 忽略了构建文件夹。我觉得自己太傻了。我接受了您的回答,因为它对遇到类似问题的其他人最有帮助。非常感谢:) @screenm0nkey 这里有同样的问题,请添加此评论作为答案。这可能会有所帮助 对于所有通过 Express 路由 React 应用程序,此答案将解决您从根路径 (' / ') -> (' /myRoute ') 到自定义域的基本重定向。 @screenm0nkey 在这里相同._。但实际上,我并没有触及使用 react-create-app 创建的默认 .gitignore...【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

检查您的 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);

【讨论】:

【参考方案4】:

添加静态文件位置后:

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

我遇到了类似的问题,Heroku open 不断抱怨在/app 中缺少index.html。但是它在本地“Heroku Local”运行良好。

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

做,

heroku git bash
dir

并确保您在此处列出了dist folder (with compiled files),一切都应该没问题。

【讨论】:

【参考方案7】:

我也遇到了这个问题,终于找到了解决办法。

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

解决方案: 只需从 .gitignore 中删除 /build 文件夹,它终于可以工作了

【讨论】:

【参考方案8】:

我遇到了同样的问题,但我已经设置了所有内容。 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'

刚刚发现这是因为在我的反应文件夹 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;
希望这对某人有所帮助。

【讨论】:

【参考方案9】:

我在使用 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 文件夹。 现在在推送主服务器之前删除"build": "react-scripts build",(与"heroku-postbuild" 存在冲突)。

【讨论】:

【参考方案10】:

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

【讨论】:

以上是关于Heroku ENOENT:没有这样的文件或目录,stat '/app/build/index.html'的主要内容,如果未能解决你的问题,请参考以下文章

ENOENT:没有这样的文件或目录。?

为啥 ENOENT 的意思是“没有这样的文件或目录”?

运行 Solidity 合约导致“ENOENT:没有这样的文件或目录”错误

NPM 安装 ENOENT 没有这样的文件或目录

Jenkins 并行阶段 - enoent ENOENT:没有这样的文件或目录

纱线安装错误“ENOENT:没有这样的文件或目录