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 ?
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 .
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'));
});
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);
});
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
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
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
});
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 !!
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.
À 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.
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");
});
...
À 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.
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
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”
})
]
};
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.
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}`); });
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"
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.......");
});