web-dev-qa-db-fra.com

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

J'ai ma première application node.js (fonctionne correctement 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, je dirais donc que l'exécution du code localement sur 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 ?

390
user428900

Heroku attribue dynamiquement un port à votre application, vous ne pouvez donc pas définir le port sur un nombre fixe. Heroku ajoute le port à env, pour que vous puissiez le tirer de là. Basculez votre écoute sur ceci:

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

De cette façon, le port 5000 sera toujours écouté lors des tests locaux, mais cela fonctionnera également sur Heroku.

Vous pouvez consulter la documentation Heroku sur Node.js ici .

872
redhotvengeance

J'ai eu le même problème tout en utilisant le 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'));
});
26
vinesh

L'erreur se produit lorsque Heroku échec de la liaison du port ou du nom d'hôte à server.listen(port, [Host], [backlog], [callback]).

Ce dont Heroku a besoin, c’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);
});
25
Royce Lee

Il vaut la peine de mentionner que si votre code ne spécifie pas de port, il ne devrait pas être un processus web et devrait probablement être un processus worker.

Alors, changez votre Procfile pour lire (avec votre commande spécifique renseignée):

worker: YOUR_COMMAND

et ensuite aussi sur CLI:

$ heroku scale worker=1

21
zthomas.nc

Pour ceux qui passent à la fois un port et un hôte, gardez à l’esprit que Heroku ne sera pas lié à 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-rran-error

18
gregb

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

J'ai eu le même problème et changer mon port d'écoute de 3000 à (process.env.PORT || 5000) a résolu le problème !!

2
Akshata Dabade

Dans mon cas, j'utilisais Babel avec le plugin plug-in babel-plugin-transform-inline-environment. Apparemment, Heroku ne définit pas la variable env. PORT lors du déploiement. process.env.PORT sera donc remplacé par undefined et votre code se repliera sur le port de développement sur lequel Heroku ne sait rien.

2
Edgar Ortega

À toute la solution, je n'ai essayé aucun travail comme prévu, j'étudie heroku par défaut le fichier .env doit conserver la convention PORT, le processus.env.PORT, heroku par défaut va rechercher le mot clé PORT.

Annulez tout changement de nom tel que APP_PORT = à la place, utilisez PORT = dans votre fichier env.

1
Delino

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

Édition package.json en tant que:

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

et Server.js en tant que:

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

À partir du processus heroku bash, transmettez la valeur de $ PORT à votre application de nœud à l’aide d’un analyseur d’options tel que yargs.

Voici un exemple de la façon dont vous pourriez le faire. Sur l'objet scripts, dans 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émarrera, elle sera liée à la valeur définie dynamiquement de $ PORT.

0
Aori Nevo

J'ai eu le même problème parce que je n'ai pas défini Procfile. Commettez 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

0
AmirRezaM75
I Use ReactJs



If you want upload to heroku add this in your webpack.config.js

Because if not add you will have
error

Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch

//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
NUR CHULIS

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

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

enter image description here

2) Problème sensible à la casse avec 'Sequelize' au lieu de 'sequelize'

enter image description here

0
Paul Elmatsidis

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 finirez comme moi et vous passerez une heure à essayer de comprendre pourquoi vous obtenez cette erreur.

0
Chris

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

La seule considération spéciale à faire est de permettre à heroku de choisir le port sur lequel le serveur est déployé. Sinon, des erreurs peuvent survenir, telles qu'un délai d'attente de la demande.

Pour configurer apollo-server afin qu'il utilise un port défini par Heroku lors de l'exécution, vous pouvez appeler la fonction d'écoute de votre fichier d'installation 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

J'ai eu le même problème, j'ai pu résoudre le problème avec remplacer "localhost" avec IP qui est "0.0.0.0"

0
Damith Asanka

Un nombre fixe ne peut pas être défini pour le port, heroku l'assigne dynamiquement à l'aide de 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
Aminu Kano