Erreur Heroku + node.js (le processus Web n'a pas pu se lier à $ PORT dans les 60 secondes suivant le lancement)


447

J'ai ma première application node.js (fonctionne bien localement) - mais je ne peux pas la déployer via heroku (première fois avec heroku également). Le code est ci-dessous. SO ne me laisse pas écrire autant de code, donc je dirais simplement que l'exécution du code localement sur mon réseau ne présente 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 ?


Pouvez-vous publier votre code ici? De préférence la partie .listen () si vous démarrez un serveur http
Benjamin Gruenbaum

Réponses:


991

Heroku attribue dynamiquement à votre application un port, vous ne pouvez donc pas définir le port sur un nombre fixe. Heroku ajoute le port à l'env, vous pouvez donc le retirer de là. Changez votre écoute à ceci:

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

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

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


97
il est important que vous utilisiez process.env.PORT et non process.env.port.
gprasant

beau! travaillé pour moi avec le module 'websocket'.
philx_x


2
Merci, a travaillé pour moi aussi. Je suis surpris que cela n'ait pas été
précisé

@redhotvengeance merci .. mentionnez qu'il est sensible à la casse et sauvez la journée :)
Mahendran

34

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

6
Avec l'appel suivant: app.listen (serverPort, "localhost", fonction (err) {Heroku échouait. La commutation de "localhost" à "0.0.0.0" a aidé. Merci!
pubsy

31

Il convient de mentionner que si votre code ne spécifie pas de port, il ne devrait pas être un webprocessus et devrait probablement être un workerprocessus à la place.

Donc, changez votre Procfilepour lire (avec votre commande spécifique remplie):

worker: YOUR_COMMAND

puis également exécuter sur CLI:

heroku scale worker=1

1
J'ai eu le même problème que j'ai pu résoudre en remplaçant 'localhost' par IP qui est '0.0.0.0'
Damith Asanka

2
J'exécute un bot Discord sur Heroku, et cela m'a jeté pour une boucle. Les robots Slack, Hipchat, etc. pourraient probablement avoir des problèmes similaires.
Skylar

1
Si vous suivez cette voie, assurez-vous d'aller dans l'onglet Ressources, désactivez le processus Web et activez le processus de travail. De cette façon, Heroku ne s'attendra pas à une liaison de port.
Isaac Lyman

1
Ohh merci beaucoup. Je suis devenu fou en essayant de chercher ça. Je n'avais aucune idée que les applications Web et de travail différaient dans Heroku en termes de Procfile. Il convient de mentionner qu'ils avaient besoin de moi pour ajouter un startscript dans monpackage.json
Rishav

1
Dans mon cas, j'ai changé le procfile de web en travailleur. Ça a marché!! Thkns
rodrigorf

27

J'ai eu le même problème lors de l'utilisation du projet généré par yeoman angular-fullstack et la suppression du 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'));
});

25

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


3
Cette réponse est non seulement plus complète, mais la seule qui ciblait les deux problèmes possibles. Dans mon cas, la configuration du port était correcte, mais pas l'adresse d'écoute. Ce devrait être la réponse acceptée.
Danielo515

Dans mon cas, cela fonctionne comme je le change comme ci-dessous const port = 3000;pour const port = process.env.PORT || 3000; qu'il fonctionne sur Heroku
vpgodara

la seule chose qui a vraiment fonctionné pour moi, merci
Ibrahim Mohammed

10

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

et pour ceux d'utilisation spécifiant process.env.PORTcorrectement, mais en laissant dans le hostparam: vous ne pouvez pas :) voir ici: stackoverflow.com/a/34956330/626369
Dominick

3

Changer mon port d'écoute de 3000 pour (process.env.PORT || 5000)résoudre le problème.


2

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


1

Modifier package.json:

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

et Server.js:

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

Dans mon cas, j'ai retiré cette partie du package.json. Je pense que sa mise à jour devrait également résoudre ce problème.
Mark

1

J'ai eu le même problème parce que je n'ai pas défini Procfile. Validez un fichier texte dans le répertoire racine de votre application nommé Procfile sans extension de fichier. Ce fichier indique à Heroku la ou les commandes à exécuter pour démarrer votre application.

web: node app.js

Merci, j'ai oublié de faire ça. Sans ce fichier, le heroku ignore complètement les fichiers.
Vladimir Despotovic

0

J'ai eu le même problème que j'ai pu résoudre en remplaçant «localhost» par IP qui est «0.0.0.0»


0

Un numéro fixe ne peut pas être défini pour le port, heroku l'attribue dynamiquement à l'aide process.env.PORT. Mais vous pouvez les ajouter tous les deux, comme ceci process.env.PORT || 5000. Heroku utilisera le premier, et votre hôte local 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

De toutes les solutions que j'ai essayées, personne ne travaille comme prévu, j'étudie heroku par défaut, le fichier .env doit maintenir le port de convention, process.env.PORT, heroku par défaut recherchera le mot-clé PORT.

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


0

À partir du processus Heroku Bash, transmettez la valeur de $ PORT à votre application de nœud en utilisant un analyseur d'options comme Yargs.

Voici un exemple de la façon dont vous pourriez le faire. Sur l'objet scripts, à l'intérieur de package.json, ajoutez une méthode de démarrage "node server --port $ PORT".

Dans votre fichier 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.
});

Désormais, lorsque votre application démarre, elle se lie à la valeur définie dynamiquement de $ PORT.


0

Si, comme moi, vous configurez Heroku pour exécuter un script à partir de votre package.jsonfichier lors du déploiement, assurez-vous que vous n'avez pas codé en dur la valeur de PORTdans ce script! Si vous le faites, vous finirez comme moi et passerez une heure à essayer de comprendre pourquoi vous obtenez cette erreur.


0

J'ai eu le même problème mais avec express et apollo-server. La solution d' ici :

La seule considération particulière qui doit être faite est de permettre à heroku de choisir le port sur lequel le serveur est déployé. Sinon, il peut y avoir des erreurs, comme un délai d'expiration de la demande.

Pour configurer apollo-server pour utiliser un port défini par Heroku lors de l'exécution, la fonction d'écoute dans votre fichier d'installation peut être appelée avec un port défini par la variable d'environnement PORT:

> server.listen({ port: process.env.PORT || 4000 }).then(({ url }) => { 
> console.log(`Server ready at ${url}`); });

0

Dans mon cas, j'ai eu deux problèmes ...

1) aucun écouteur du tout en raison de l'exécution de l'application à partir d'un autre fichier d'entrée et ce script d'exécution a été supprimé des "scripts" package.json

entrez la description de l'image ici

2) Problème sensible à la casse avec «Sequelize» au lieu de «Sequelize»

entrez la description de l'image ici


0

J'utilise ReactJs, si vous voulez télécharger sur heroku ajoutez ceci dans votre webpack.config.js

Parce que sinon, vous aurez une erreur

Erreur R10 (Boot timeout) -> Le processus Web n'a pas pu se lier à $ PORT dans les 60 secondes suivant le lancement

//webpack.config.js add code like that

const HtmlWebPackPlugin = require(“html-webpack-plugin”);
const MiniCssExtractPlugin = require(“mini-css-extract-plugin”);
var server_port = process.env.YOUR_PORT || process.env.PORT || 5000;
var server_host = process.env.YOUR_HOST || 0.0.0.0’;

module.exports = {
 module: {
 rules: [
 {
 test: /\.js$/,
 exclude: /node_modules/,
 use: {
 loader: babel-loader
 }
 },
 {
 test: /\.css$/,
 use: [MiniCssExtractPlugin.loader, css-loader”]
 }
 ]
 },
 devServer: {
 disableHostCheck: true,
 contentBase: ‘./dist’,
 compress: true,
 inline: true,
 port:server_port,
 host:server_host

},
 plugins: [
 new HtmlWebPackPlugin({
 template: “./src/index.html”,
 filename: index.html
 }),
 new MiniCssExtractPlugin({
 filename: “[name].css”,
 chunkFilename: “[id].css
 })
 ]
};

0

Dans mon cas, ni le port ni l'hôte n'étaient le problème. Le index.jsfichier était divisé en 2 fichiers. server.js:

//server.js
const express = require('express')
const path = require('path')

const app = express()

app.use(express.static(path.resolve(__dirname, 'public')));
// and all the other stuff
module.exports = app

//app.js
const app = require('./server');
const port = process.env.PORT || 3000;
app.listen(port, '0.0.0.0', () => {
    console.log('Server is running s on port: ' + port)
});

de package.jsonnous avons couru node app.js.

Apparemment, c'était ça le problème. Une fois que j'ai combiné les deux en un seul fichier, l'application Heroku s'est déployée comme prévu.


0

Mon problème était que lors du déploiement sur Heroku, j'ai eu une erreur:

Le processus Web n'a pas réussi à se lier à $ PORT dans les 60 secondes suivant le lancement

lors de l'exécution heroku logs --taildans le terminal. MAIS l'application s'exécuterait comme prévu lorsque j'exécutais le serveur localement.

Je l'avais dans mon index.jsfichier (fichier serveur)

const PORT = process.env.port || 4000

app.listen(PORT, () => {
  console.log(`Server listening on port ${PORT}`)
})

Mais aurait dû avoir cette

const PORT = process.env.PORT || 4000

app.listen(PORT, () => {
  console.log(`Server listening on port ${PORT}`)
})

Utilisez process.env.PORT, non process.env.port, car ce portn'est pas la même chose PORTqu'évidemment.

Crédit à gprasant .


0

J'ai réalisé que je n'avais pas besoin du numéro de port dans le point de terminaison de la demande, donc le point de terminaison l'était herokuapp.comet non herokuapp.com:5000.

L' listen()appel peut être sans hôte ni rappel:

server.listen(5000);

Vous n'avez pas besoin du numéro de port dans l'URL si vous utilisez le port par défaut. Alors, comment cela résout-il le problème?
RalfFriedl
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.