Je ne parviens pas à gérer un simple site de test à Heroku. Pour une raison quelconque, il essaie de diffuser le contenu de/app/build/lorsque je souhaite le diffuser depuis/build /.
Erreur: ENOENT: aucun fichier ou répertoire de ce type, stat '/app/build/index.html'
Je lis ici de ne pas utiliser __dirname dans l'application express comme Heroku le définit sur/app et que je devrais utiliser process.cwd ();
process.env.PWD = process.cwd();
Mais ça n'a pas marché. Vous trouverez ci-dessous la structure de l'application serveur.js Express et de son dossier.
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');
Tout d'abord, n'utilisez pas PWD. Il suffit d'utiliser __dirname. Cela fonctionne sur Heroku exactement comme partout ailleurs. L'utilisation de PWD rend votre application plus fragile si vous exécutez, par exemple, un fichier binaire à partir d'un répertoire non local.
Deuxièmement, la raison pour laquelle ce fichier n'existe pas sur Heroku est probablement due au fait que vous l'avez ajouté à votre fichier .gitignore ou que vous ne l'avez généralement pas archivée dans git. Vous pouvez voir cela à partir du code couleur de votre éditeur: tous les fichiers archivés dans git sont en blanc, ceux qui sont ignorés en gris (comme le répertoire node_modules et build/bundle). Votre fichier d'index est rouge (pas blanc comme les fichiers archivés). Ainsi, lorsque vous git Push heroku master
, les fichiers que vous référencez n'existent pas.
Enfin, ENOENT dit que/app/build est simplement dû au fait que votre répertoire racine/home sur Heroku est/app. Ne créez jamais d'applications qui sont verrouillées dans une structure de fichier absolue. utilisez simplement des chemins relatifs (sinon, votre application sera interrompue si vous la déplacez même dans un autre répertoire de votre ordinateur local).
app.get('*', function (req, res) {
const index = path.join(__dirname, 'build', 'index.html');
res.sendFile(index);
});
dist dossier est ignoré. Par conséquent, heroku renvoie cette erreur. Lorsque vous répertoriez les fichiers de votre application dans heroku, vous pouvez constater qu’il en manque.
Comment lister les dossiers/fichiers dans heroku
Vérifiez votre fichier package.json
"postinstall": "ng build --aot --prod"
Vérifiez votre fichier 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);
Une fois que vous avez ajouté l'emplacement du fichier statique avec:
app.use(express.static('build'));
Express recherche les fichiers par rapport au répertoire statique. Le nom du répertoire statique ne fait donc pas partie de l'URL. Vous devriez pouvoir faire ceci pour obtenir index.html:
app.get('*', function (req, res) {
res.sendFile('index.html');
});
J'ai eu un problème similaire où Heroku open
a continué à se plaindre pour avoir manqué index.html
à l'intérieur de /app
. Cependant, cela fonctionnait très bien localement 'Heroku Local
'.
Le problème était que j'avais explicitement ignoré les fichiers/dossiers compilés, par exemple. /dist
dans le fichier gitignore
et, par conséquent, /dist
n'a jamais été inséré dans le dossier heroku
déployé.
Faire,
heroku git bash
dir
et assurez-vous que dist folder (with compiled files)
est répertorié ici et que tout devrait bien se passer.
Notez qu'il est préférable d'utiliser la commande heroku-postbuild
dans votre script plutôt que de pousser le dossier build
.
"scripts": {
"start": "node index.js",
"heroku-postbuild": "cd client && npm install && npm run build"
}