Heroku + node.erreur js (le processus Web ne se lie pas à $PORT dans les 60 secondes suivant le lancement))
j'ai mon premier noeud.js app (fonctionne bien localement) - mais je ne suis pas en mesure de le déployer via heroku (première fois w/ heroku aussi). Le code est ci-dessous. Donc ne me laisse pas écrire autant de code, donc je voudrais juste dire que l'exécution du code localement aussi bien à l'intérieur de mon réseau ne montre 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 ?
15 réponses
Heroku assigne dynamiquement un port à votre application, de sorte que vous ne pouvez pas définir le port à un nombre fixe. Heroku ajoute le port à l'env, de sorte que vous pouvez le retirer de là.
.listen(process.env.PORT || 5000)
de cette façon, il écoutera toujours le port 5000 lorsque vous le testez localement, mais il fonctionnera aussi sur Heroku.
vous pouvez consulter les docs Heroku sur le noeud.js ici .
j'ai eu le même problème en utilisant le projet généré par yeoman angular-fullstack et en supprimant le paramètre IP a fonctionné 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 dont Heroku a besoin est .listen(process.env.PORT)
ou .listen(process.env.PORT, '0.0.0.0')
donc plus généralement, pour supporter 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 est intéressant de mentionner que si votre code ne spécifie pas de port, alors il ne devrait pas être un web
processus et devrait probablement être un worker
processus à la place.
alors, changez votre Procfile
pour lire (avec votre commande spécifique remplie):
worker: YOUR_COMMAND
et ensuite courir aussi sur CLI:
$ heroku scale worker=1
dans mon cas, j'utilisais l'exemple de https://hapijs.com /
pour résoudre le problème, 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 liera 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'ai été à l'aide de Babel avec le babel-plugin-transformer-inline-environnement-variables plugin. Apparemment, Heroku ne règle pas la variable port env lors d'un déploiement, donc process.env.PORT
sera remplacé par undefined
, et votre code retombera sur le port de développement dont Heroku ne sait rien.
les étapes ci-dessous résolvent ma solution:
édition" paquet 151930920".json :
...
"engines": {
"node": "5.0.0",
"npm": "4.6.1"
},
...
Serveur et .js :
...
var port = process.env.PORT || 3000;
app.listen(port, "0.0.0.0", function() {
console.log("Listening on Port 3000");
});
...
At de toute la solution j'ai essayé aucun travail comme prévu, j'étudie heroku par défaut le .le dossier env devrait maintenir le PORT de la convention, le processus.env.PORT, heroku par défaut va chercher le PORT de mot clé.
annulez tout renommage tel que APP_PORT = utilisez plutôt PORT= dans votre fichier env.
j'ai eu le même problème et j'ai changé mon port d'écoute de 3000 à (process.env.PORT / / 5000) résolu le problème!!
j'ai eu la même question je pourrais résoudre problème avec remplacer 'localhost' avec IP qui est '0.0.0.0 '
un nombre fixe ne peut pas être défini pour le port, heroku l'assigne dynamiquement en utilisant process.env.PORT
. Mais vous pouvez les ajouter tous les deux, comme ceci process.env.PORT || 5000
. Heroku utilisera le premier, et votre localhost utilisera le second.
Vous pouvez même ajouter votre fonction de rappel. Regardez le code ci-dessous
app.listen(process.env.PORT || 5000, function() {
console.log("Server started.......");
});
du processus heroku bash, transmettez la valeur de $PORT à votre application node en utilisant un analyseur d'options comme yargs.
voici un exemple de ce que vous pourriez faire. Sur l'objet scripts, à l'intérieur du paquet.JSON, ajoute une méthode de démarrage "node server --port $PORT".
dans votre fichier serveur, utilisez yargs pour obtenir la valeur de l'option port (--port $PORT) de la méthode start:
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, quand votre application démarre, il se liera à la valeur dynamiquement définie de $PORT.
si, comme moi, vous configurez Heroku pour exécuter un script à partir de votre fichier package.json
sur deploy, assurez-vous que vous n'avez pas codé dur la valeur de PORT
dans ce script! Si vous le faites, vous finirez comme moi et passer une heure à essayer de comprendre pourquoi vous obtenez cette erreur.
j'ai eu le même problème mais avec express et apollo-serveur. La solution de ici :
la seule considération spéciale qui doit être faite est de permettre heroku pour choisir le port sur lequel le serveur est déployé. Autrement, il peut y avoir des erreurs, comme un délai de requête.
pour configurer apollo-server pour utiliser un port défini par Heroku à l'exécution, l'écoute de la fonction dans votre fichier de configuration peut être appelé avec un port défini par la variable D'environnement du PORT:
> server.listen({ port: process.env.PORT || 4000 }).then(({ url }) => {
> console.log(`Server ready at ${url}`); });