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

时间:2019-01-04 20:12:14

标签: reactjs heroku heroku-cli

从字面上看,我已经为这个错误苦苦挣扎了近三个星期,老实说,这使我发疯。我已经使用Heroku部署我的项目已有一年多了,在发布这个新网站之前,我从未遇到过任何错误。您会看到,当我的完整React项目位于名为client的文件夹中时,我当前在我的node项目中安装了一个名为“ index.js”的邮件服务器。

enter image description here 现在,这是很奇怪的事情。我的index.js看起来像这样:

if (process.env.NODE_ENV === 'production') {
    app.use(express.static('client/build'));
    const path = require('path');
    app.get('*', (req, res) => {
      res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'));
    });
  }

但是每次我按下Heroku时,都会在控制台中收到以下错误消息:

Error: ENOENT: no such file or directory, stat '/app/client/build/index.html'

我也一直在尝试更改和修改路径中的目录,以查看是否有任何更改。我也仔细研究了整个互联网,找到了这个问题的潜在解决方案,但没有任何运气。如果有人至少可以指出我在这里似乎做错的正确方向,我将万分感谢。

谢谢。

4 个答案:

答案 0 :(得分:1)

我只是遇到了同样的问题。您需要在package.json中添加一个heroku-postbuild脚本。我在项目中使用了create-react-app,因此,如果您没有做这行,可能会有所不同:

"heroku-postbuild": "cd client && npm install --only=dev && npm install && npm run build"

当我运行npm run build时,create-react-app会编译build /文件夹中的缩小的index.html文件,因此,如果您指向的构建文件位于其他位置,则可能需要修改命令。 / p>

我的服务器结构如下:

server.js
client/
  build/
  public/
    - index.html
  src/
    - index.js


我在this handy article

中找到了解决方案

答案 1 :(得分:1)

我遇到了同样的错误,但我的问题不是上述问题,所以我决定将其发布在这里 - 也许可以帮助某人。
我想部署我当前的工作分支,它不是 master,但是在运行命令 git push heroku master 时,我没有意识到默认部署的分支是 master。由于我在一些提交中领先于 master,包括在新位置连接我的 server.js 文件,heroku 无法找到它。
所以实际上我的解决方案就像运行 git push heroku <current-branch-name>:master 一样简单,现在一切正常。

答案 2 :(得分:0)

我在一个带有NodeJS和Express的React工程中也遇到了同样的情况。在我有NodeJS文件的文件夹中(因此不在客户端文件夹中,React所在的文件夹中),我在package.json中是这样的:

"scripts": {
    "start": "node server.js",
    "server": "nodemon server.js",
    "client": "npm start --prefix client",
    "client-install": "npm install --prefix client",
    "dev": "concurrently \"npm run server\" \"npm run client\"",
    "heroku-postbuild": "NPM_CONFIG_PRODUCTION=false npm install --prefix client && npm run build --prefix client"
  },

在server.js中,我有:

// Serve static assets in production
if (process.env.NODE_ENV === 'production') {
  // Set static folder
  app.use(express.static('client/build'));

  app.get('*', (request, response) => {
    response.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'));
  });
}

在同一文件夹(NodeJS)中,有一个供Mongo用户使用的文件production.js并通过:

module.exports = {
  mongoURI:
    'mongodb+srv://yyyyyyyyy:xxxxxxxx@cluster0-pana5.mongodb.net/test?retryWrites=true&w=majority',
};

所以在server.js中,我带了这个文件:

const db = require('./config/production').mongoURI;

仍然在这里,使用db连接到MongoDB:

mongoose
  .connect(db, {
    useNewUrlParser: true,
    useCreateIndex: true,
    useFindAndModify: false
  })
  // use a promise to check if success
  .then(() => console.log('MongoDB Connected!'))
  .catch(error => console.log('MongoDB did not connect: ', error));

对我来说就是这样。

答案 3 :(得分:-1)

没有使用Heroku,我想问题是“ /app/client/build/index.html”。

真的在/ app /下吗?也许您应该使用类似的相对路径:

app/client/build/index.html