5
votes

Heroku pas de tel fichier ou répertoire, stat '/app/client/build/index.html'

Je lutte avec cette erreur depuis presque trois semaines maintenant, et honnêtement, cela me rend fou. J'utilise Heroku pour déployer mes projets depuis plus d'un an maintenant, et je n'ai jamais rencontré d'erreurs jusqu'à ce que j'allais publier mon nouveau site Web. Vous voyez, j'ai actuellement un serveur de messagerie installé dans mon projet de nœud, appelé "index.js" tandis que mon projet React complet est dans un dossier appelé client.

 entrez la description de l'image ici Maintenant, voici ce qui est bizarre. Mon index.js ressemble à ceci:

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

Mais chaque fois que je pousse vers Heroku, j'obtiens ce message d'erreur dans la console:

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'));
    });
  }


1 commentaires

Pouvez-vous publier votre package.json ? Plus précisément les scripts ...


3 Réponses :


-2
votes

N'ayant pas utilisé Heroku, je suppose que le problème est '/app/client/build/index.html'.

Est-ce vraiment sous / app /? Vous devriez peut-être utiliser un chemin relatif comme:

app/client/build/index.html


1 commentaires

C'est ce que je pense (pas tout à fait sûr que cela), cette ligne signifie: res.sendFile (path.resolve (__ dirname, 'client', 'build', 'index.html')); tandis que __dirname est 'app' qui est la racine de Heroku en ce qui me concerne.



4
votes

Je viens de rencontrer le même problème. Vous devez ajouter un script heroku-postbuild dans votre package.json. J'ai utilisé create-react-app pour mon projet, donc si vous ne l'avez pas fait, cette ligne peut différer un peu:

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

Lorsque j'exécute npm run build , create-react-app compile un fichier index.html minifié dans le dossier build /, donc vous peut avoir besoin de modifier la commande si le fichier de construction que vous pointez se trouve ailleurs.

Ma structure de serveur est comme ceci:

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


J'ai trouvé la solution dans cet article pratique


0 commentaires

0
votes

J'ai eu la même chose dans un projet React avec NodeJS et Express. Dans le dossier où j'ai des fichiers NodeJS (donc pas dans le dossier client, où se trouve React), j'ai dans le package.json ceci:

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));

Et dans le server.js j'ai:

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

Dans le même dossier (NodeJS) j'ai un fichier production.js pour l'utilisateur Mongo et passe:

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

Donc dans server.js j'apporte ce fichier:

// 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'));
  });
}

et toujours là, connectez-vous à MongoDB, en utilisant db:

"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"
  },

Pour moi a fonctionné comme ça.


0 commentaires