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 ?

312
demandé sur user428900 2013-03-29 02:20:39

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 .

723
répondu redhotvengeance 2013-03-28 22:41:52

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'));
});
24
répondu vinesh 2015-08-02 20:06:06

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);
});
20
répondu Royce Lee 2014-08-21 05:35:27

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

12
répondu zthomas.nc 2018-09-28 17:56:37

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 
});
8
répondu nexuzzz 2017-01-19 05:55:32

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

6
répondu gregb 2017-11-21 18:56:02

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.

1
répondu Edgar Ortega 2017-05-07 17:20:08

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");
});
...
1
répondu Naveen Kumar V 2017-12-14 11:54:33

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.

1
répondu delino 2018-02-09 11:45:06

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!!

1
répondu Akshata Dabade 2018-09-26 13:22:54

j'ai eu la même question je pourrais résoudre problème avec remplacer 'localhost' avec IP qui est '0.0.0.0 '

0
répondu Damith Asanka 2017-07-16 18:55:27

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.......");
});
0
répondu Aminu Kano 2017-11-07 06:48:31

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.

0
répondu Aori Nevo 2018-03-16 03:25:48

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.

0
répondu Chris 2018-05-13 16:49:12

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}`); });
0
répondu Antony Petrocelli 2018-10-02 18:52:28