我在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');
答案 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中列出文件夹/文件
答案 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');
});
答案 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"
}
仅发现发生这种情况是因为在我的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 文件夹,它就最终工作。