Erreur Heroku + node.js (Echec de la liaison du processus Web à $ PORT dans les 60 secondes suivant le lancement)

J’ai ma première application node.js (fonctionne bien localement) – mais je ne parviens pas à la déployer via heroku (la première fois avec heroku également). Le code est ci-dessous. SO ne me laisse pas écrire autant de code, alors je dirais simplement que l’exécution du code localement aussi bien sur mon réseau ne pose aucun problème.

var http = require('http'); var fs = require('fs'); var path = require('path'); http.createServer(function (request, response) { console.log('request starting for '); console.log(request); var filePath = '.' + request.url; if (filePath == './') filePath = './index.html'; console.log(filePath); var extname = path.extname(filePath); var contentType = 'text/html'; switch (extname) { case '.js': contentType = 'text/javascript'; break; case '.css': contentType = 'text/css'; break; } path.exists(filePath, function(exists) { if (exists) { fs.readFile(filePath, function(error, content) { if (error) { response.writeHead(500); response.end(); } else { response.writeHead(200, { 'Content-Type': contentType }); response.end(content, 'utf-8'); } }); } else { response.writeHead(404); response.end(); } }); }).listen(5000); console.log('Server running at http://127.0.0.1:5000/'); 

Une idée ?

Heroku atsortingbue dynamicment un port à votre application, vous ne pouvez donc pas définir le port sur un numéro fixe. Heroku ajoute le port à l’env, vous pouvez donc le retirer à partir de là. Changez votre écoute à ceci:

.listen(process.env.PORT || 5000)

De cette façon, il écoutera toujours le port 5000 lorsque vous testez localement, mais cela fonctionnera également sur Heroku.

Vous pouvez consulter les documents Heroku sur Node.js ici .

J’ai eu le même problème en utilisant le projet généré par full-stack angular de yeoman et en supprimant le paramètre IP travaillé pour moi.

J’ai remplacé ce code

 server.listen(config.port, config.ip, function () { console.log('Express server listening on %d, in %s mode', config.port, app.get('env')); }); 

avec

 server.listen(config.port, function () { console.log('Express server listening on %d, in %s mode', config.port, app.get('env')); }); 

L’erreur se produit lorsque Heroku n’a pas réussi à lier le port ou le nom d’hôte à server.listen(port, [host], [backlog], [callback]) .

Ce que Heroku exige, c’est .listen(process.env.PORT) ou .listen(process.env.PORT, '0.0.0.0')

Donc, de manière plus générique, pour prendre en charge d’autres environnements, utilisez ceci:

 var server_port = process.env.YOUR_PORT || process.env.PORT || 80; var server_host = process.env.YOUR_HOST || '0.0.0.0'; server.listen(server_port, server_host, function() { console.log('Listening on port %d', server_port); }); 

Il convient de mentionner que si votre code ne spécifie pas de port, il ne devrait pas s’agir d’un processus web et devrait plutôt être un processus de worker place.

Alors, changez votre Procfile pour le lire (avec votre commande spécifique remplie):

worker YOUR_COMMAND

puis exécutez également sur CLI:

$ heroku scale worker=1

Dans mon cas, j’utilisais l’exemple de https://hapijs.com/

Pour résoudre le problème que j’ai remplacé

 server.connection({ host: 'localhost', port: 8000 }); 

avec

 server.connection({ port: process.env.PORT || 3000 }); 

Pour ceux qui passent à la fois un port et un hôte, gardez à l’esprit que Heroku ne se connectera pas à localhost .

Vous devez passer 0.0.0.0 pour l’hôte.

Même si vous utilisez le bon port. Nous avons dû faire cet ajustement:

 # port (as described above) and host are both wrong const host = 'localhost'; const port = 3000; # use alternate localhost and the port Heroku assigns to $PORT const host = '0.0.0.0'; const port = process.env.PORT || 3000; 

Ensuite, vous pouvez démarrer le serveur, comme d’habitude:

 app.listen(port, host, function() { console.log("Server started......."); }); 

Vous pouvez voir plus de détails ici: https://help.heroku.com/P1AVPANS/why-is-my-node-js-app-crashing-with-an-r10-error

Dans mon cas, j’utilisais Babel avec le plugin babel-plugin-transform-inline-environment-variables . Apparemment, Heroku ne définit pas la variable env PORT lors d’un déploiement, donc process.env.PORT sera remplacé par undefined , et votre code sera remplacé par le port de développement dont Heroku ne sait rien.

Les étapes ci-dessous ont résolu ma solution:

Modifier package.json en tant que:

 ... "engines": { "node": "5.0.0", "npm": "4.6.1" }, ... 

et Server.js comme:

 ... var port = process.env.PORT || 3000; app.listen(port, "0.0.0.0", function() { console.log("Listening on Port 3000"); }); ... 

À toutes les solutions que j’ai essayées, je n’ai pas travaillé comme prévu, j’étudie heroku par défaut le fichier .env devrait maintenir la convention PORT, le process.env.PORT, heroku par défaut cherchera le mot-clé PORT.

Annulez tout changement de nom tel que APP_PORT = utilisez plutôt PORT = dans votre fichier env.

J’ai eu le même problème, j’ai pu résoudre le problème avec le remplacement de ‘localhost’ avec IP qui est ‘0.0.0.0’

Un numéro fixe ne peut pas être défini pour le port, heroku l’assigne dynamicment en utilisant process.env.PORT . Mais vous pouvez les append tous les deux, comme ceci process.env.PORT || 5000 process.env.PORT || 5000 . Heroku utilisera le premier et votre localhost utilisera le second.

Vous pouvez même append votre fonction de rappel. Regardez le code ci-dessous

 app.listen(process.env.PORT || 5000, function() { console.log("Server started......."); }); 

A partir du processus heroku bash, transmettez la valeur de $ PORT à votre application de noeud en utilisant un parsingur d’options tel que yargs.

Voici un exemple de la façon dont vous pourriez le faire. Sur l’object scripts, à l’intérieur de package.json, ajoutez une méthode de démarrage “node server –port $ PORT”.

Dans votre fichier de serveur, utilisez yargs pour obtenir la valeur de l’option de port (–port $ PORT) de la méthode de démarrage:

 const argv = require('yargs').argv; const app = require('express')(); const port = argv.port || 8081; app.listen(argv.port, ()=>{ console.log('Probably listening to heroku $PORT now ', argv.port); // unless $PORT is undefined, in which case you're listening to 8081. }); 

Maintenant, lorsque votre application démarre, elle se liera à la valeur définie dynamicment de $ PORT.

Si, comme moi, vous configurez Heroku pour exécuter un script à partir de votre fichier package.json lors du déploiement, assurez-vous de ne pas avoir codé en dur la valeur de PORT dans ce script! Si vous le faites, vous vous retrouverez comme moi et passerez une heure à essayer de comprendre pourquoi vous obtenez cette erreur.