Heroku + node.js-Fehler (Webprozess konnte nicht innerhalb von 60 Sekunden nach dem Start an $ PORT gebunden werden)

447

Ich habe meine erste node.js-App (läuft lokal einwandfrei), kann sie jedoch nicht über Heroku bereitstellen (auch zum ersten Mal mit Heroku). Der Code ist unten. SO lässt mich nicht so viel Code schreiben, daher würde ich nur sagen, dass das lokale Ausführen des Codes auch in meinem Netzwerk kein Problem darstellt.

 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/');

Irgendeine Idee ?

user428900
quelle
Können Sie Ihren Code hier posten? Am besten der .listen () Teil, wenn Sie einen http Server starten
Benjamin Gruenbaum

Antworten:

986

Heroku weist Ihrer App dynamisch einen Port zu, sodass Sie den Port nicht auf eine feste Nummer festlegen können. Heroku fügt den Port der Umgebung hinzu, sodass Sie ihn von dort aus ziehen können. Schalten Sie Ihr Hören auf diese:

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

Auf diese Weise hört es beim lokalen Testen immer noch Port 5000 ab, funktioniert aber auch mit Heroku.

Sie können die Heroku-Dokumente auf Node.js hier ansehen .

redhotvengeance
quelle
96
wichtig, dass Sie process.env.PORT und nicht process.env.port verwenden.
Gprasant
wunderschönen! arbeitete für mich mit dem 'Websocket'-Modul.
philx_x
1
Danke, dass du mir Zeit gespart hast.
Allsoft
2
Danke, hat auch für mich gearbeitet. Ich bin überrascht, dass dies in den Heroku-Dokumenten nicht klarer gemacht wurde
Sidarcy
34

Der Fehler tritt auf, wenn Heroku fehlgeschlagen den Port oder den Hostnamen zu binden , bei server.listen(port, [host], [backlog], [callback]).

Was Heroku benötigt, ist .listen(process.env.PORT)oder.listen(process.env.PORT, '0.0.0.0')

Verwenden Sie daher generischer Folgendes, um andere Umgebungen zu unterstützen:

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);
});
Royce Lee
quelle
6
Mit folgendem Aufruf: app.listen (serverPort, "localhost", function (err) {Heroku schlug fehl. Das Umschalten von "localhost" auf "0.0.0.0" half. Danke!
pubsy
31

Es ist erwähnenswert, dass wenn Ihr Code keinen Port angibt, es kein webProzess sein sollte und wahrscheinlich stattdessen ein workerProzess.

Ändern Sie also Ihre Procfilezu lesen (mit Ihrem spezifischen Befehl ausgefüllt):

worker: YOUR_COMMAND

und dann auch auf CLI ausführen:

$ heroku scale worker=1

zthomas.nc
quelle
1
Ich hatte das gleiche Problem, das ich lösen konnte,
indem
2
Ich starte einen Discord-Bot auf Heroku, und das warf mich für eine Schleife. Slack-, Hipchat- usw. Bots könnten wahrscheinlich ähnliche Probleme haben.
Skylar
1
Wenn Sie diesen Weg gehen, stellen Sie sicher, dass Sie zur Registerkarte Ressourcen wechseln, den Webprozess deaktivieren und den Arbeitsprozess aktivieren. Auf diese Weise erwartet Heroku keine Portbindung.
Isaac Lyman
1
Ohh, vielen Dank. Ich bin verrückt geworden und habe versucht, das nachzuschlagen. Ich hatte keine Ahnung, dass sich Web- und Worker-Anwendungen in Heroku in Bezug auf das Procfile unterschieden. Es ist erwähnenswert, dass ich ein startSkript in meinpackage.json
Rishav
1
In meinem Fall habe ich das Procfile von Web auf Worker geändert. Es funktionierte!! Thkns
Rodrigorf
27

Ich hatte das gleiche Problem bei der Verwendung von Yeomans vom Winkel-Vollstapel generiertem Projekt und beim Entfernen des IP-Parameters, der für mich funktioniert hat.

Ich habe diesen Code ersetzt

server.listen(config.port, config.ip, function () {
  console.log('Express server listening on %d, in %s mode', config.port, app.get('env'));
});

mit

server.listen(config.port, function () {
  console.log('Express server listening on %d, in %s mode', config.port, app.get('env'));
});
Weinreben
quelle
25

Denken Sie für diejenigen, die sowohl einen Port als auch einen Host passieren, daran, dass Heroku nicht daran gebunden ist localhost .

Sie müssen 0.0.0.0 als Gastgeber durchgehen.

Auch wenn Sie den richtigen Port verwenden. Wir mussten diese Anpassung vornehmen:

# 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;

Dann können Sie den Server wie gewohnt starten:

app.listen(port, host, function() {
  console.log("Server started.......");
});

Weitere Details finden Sie hier: https://help.heroku.com/P1AVPANS/why-is-my-node-js-app-crashing-with-an-r10-error

gregb
quelle
3
Diese Antwort ist nicht nur vollständiger, sondern auch die einzige, die die beiden möglichen Probleme angeht. In meinem Fall war die Portkonfiguration korrekt, aber nicht die Abhöradresse. Dies sollte die akzeptierte Antwort sein.
Danielo515
In meinem Fall funktioniert es wie ich , wie unten verändert , const port = 3000;um const port = process.env.PORT || 3000; es auf Heroku arbeitet
vpgodara
Das einzige, was tatsächlich für mich funktioniert hat, danke
Ibrahim Mohammed
10

In meinem Fall habe ich ein Beispiel von https://hapijs.com/ verwendet.

Um das Problem zu beheben, habe ich ersetzt

server.connection({ 
    host: 'localhost', 
    port: 8000 
});

mit

server.connection({
    port: process.env.PORT || 3000 
});
nexuzzz
quelle
und für diejenigen, die process.env.PORTkorrekt hostangeben , aber den Parameter belassen: Sie können nicht :) siehe hier: stackoverflow.com/a/34956330/626369
Dominick
3

Ich hatte das gleiche Problem und das Ändern meines Listening-Ports von 3000 auf (process.env.PORT || 5000) löste das Problem !!

Akshata Dabade
quelle
2

In meinem Fall habe ich Babel mit dem Babel-Plugin-Transform-Inline-Umgebungsvariablen- Plugin verwendet. Anscheinend setzt Heroku die Variable PORT env bei einer Bereitstellung nicht, process.env.PORTwird also durch ersetzt undefinedund Ihr Code wird auf den Entwicklungsport zurückgesetzt, von dem Heroku nichts weiß.

Edgar Ortega
quelle
1

Die folgenden Schritte haben meine Lösung gelöst:

Bearbeiten von package.json als:

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

und Server.js als:

...
var port = process.env.PORT || 3000;
app.listen(port, "0.0.0.0", function() {
console.log("Listening on Port 3000");
});
...
Naveen Kumar V.
quelle
In meinem Fall habe ich diesen Teil der package.json. Ich glaube, eine Aktualisierung sollte auch dieses Problem lösen.
Mark
1

Ich hatte das gleiche Problem, weil ich Procfile nicht definiert habe. Übertragen Sie eine Textdatei in das Stammverzeichnis Ihrer App mit dem Namen Procfile ohne Dateierweiterung. Diese Datei teilt Heroku mit, welche Befehle ausgeführt werden sollen, um Ihre App zu starten.
web: node app.js

AmirRezaM75
quelle
Danke, ich habe das vergessen. Ohne diese Datei ignoriert das Heroku die Dateien einfach vollständig.
Vladimir Despotovic
0

Ich hatte das gleiche Problem, das ich lösen konnte, indem ich 'localhost' durch IP ersetzt habe, das '0.0.0.0' ist.

Damith Asanka
quelle
0

Eine feste Nummer kann nicht für den Port festgelegt werden, Heroku weist sie dynamisch zu process.env.PORT. Aber Sie können beide so hinzufügen process.env.PORT || 5000. Heroku wird den ersten verwenden, und Ihr lokaler Host wird den zweiten verwenden.

Sie können sogar Ihre Rückruffunktion hinzufügen. Schauen Sie sich den Code unten an

app.listen(process.env.PORT || 5000, function() {
    console.log("Server started.......");
});
Aminu Kano
quelle
0

Bei all der Lösung, bei der ich versucht habe, dass niemand wie erwartet arbeitet, studiere ich Heroku standardmäßig. Die .env-Datei sollte die Konvention PORT beibehalten, die process.env.PORT, Heroku sucht standardmäßig nach dem Schlüsselwort PORT.

Brechen Sie alle Umbenennungen wie APP_PORT = ab und verwenden Sie stattdessen PORT = in Ihrer env-Datei.

Delino
quelle
0

Übergeben Sie im Heroku-Bash-Prozess den Wert von $ PORT mithilfe eines Optionsparsers wie yargs an Ihre Node-App.

Hier ist ein Beispiel, wie Sie das tun könnten. Fügen Sie für das Skriptobjekt in package.json eine Startmethode "node server --port $ PORT" hinzu.

Verwenden Sie in Ihrer Serverdatei yargs, um den Wert aus der Portoption (--port $ PORT) der Startmethode abzurufen:

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

Wenn Ihre App gestartet wird, wird sie an den dynamisch festgelegten Wert von $ PORT gebunden.

Aori Nevo
quelle
0

Wenn Sie wie ich Heroku so konfigurieren package.json, dass beim Bereitstellen ein Skript aus Ihrer Datei ausgeführt wird, stellen Sie sicher, dass Sie den Wert von PORTin diesem Skript nicht fest codiert haben ! Wenn Sie dies tun, werden Sie wie ich enden und eine Stunde damit verbringen, herauszufinden, warum Sie diesen Fehler erhalten.

Chris
quelle
0

Ich hatte das gleiche Problem, aber mit Express und Apollo-Server. Die Lösung von hier :

Die einzige besondere Überlegung, die gemacht werden muss, besteht darin, Heroku die Auswahl des Ports zu ermöglichen, auf dem der Server bereitgestellt wird. Andernfalls können Fehler auftreten, z. B. ein Anforderungszeitlimit.

Um Apollo-Server so zu konfigurieren, dass zur Laufzeit ein von Heroku definierter Port verwendet wird, kann die Listen-Funktion in Ihrer Setup-Datei mit einem Port aufgerufen werden, der durch die Umgebungsvariable PORT definiert ist:

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

In meinem Fall hatte ich zwei Probleme ...

1) überhaupt kein Listener, da die App aus einer anderen Eintragsdatei ausgeführt wurde und dieses Ausführungsskript aus package.json "scripts" gelöscht wurde.

Geben Sie hier die Bildbeschreibung ein

2) Groß- und Kleinschreibung mit 'Sequelize' anstelle von 'Sequelize' beachten.

Geben Sie hier die Bildbeschreibung ein

Elmatsidis Paul
quelle
0

Ich hatte das gleiche Problem. Schließlich wurde mir klar, dass ich die Portnummer im Anforderungsendpunkt nicht benötige. (Der Endpunkt war also https: //...herokuapp.com und nicht https: //...herokuapp.com: 5000 ).

Der listen () -Aufruf kann ohne Host und Rückruf erfolgen: server.listen (5000);

Shai Fisher
quelle
Sie benötigen die Portnummer in der URL nicht, wenn Sie den Standardport verwenden. Wie löst das das Problem?
RalfFriedl
0

In meinem Fall war weder der Port noch der Host das Problem. Unsere index.js wurde in 2 Dateien server.js unterteilt

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

Von package.json haben wir den Knoten app.js ausgeführt

Anscheinend war das das Problem. Nachdem ich die beiden in einer Datei zusammengefasst hatte, wurde die Heroku-App wie erwartet bereitgestellt.

Hoffe, es hilft jemandem, da ich niemanden gefunden habe, der auf dieses Problem gestoßen ist

jonyB
quelle
0

Ich benutze ReactJs. Wenn Sie auf heroku hochladen möchten, fügen Sie dies in Ihre webpack.config.js ein

Denn wenn nicht hinzugefügt, werden Sie Fehler haben

Fehler R10 (Boot-Timeout) -> Der Webprozess konnte nicht innerhalb von 60 Sekunden nach dem Start an $ PORT gebunden werden

//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
 })
 ]
};
NUR CHULIS
quelle
0

Gutschrift an: gprasant

Ich möchte dies nur erneut veröffentlichen, da diese Antwort mein Problem behoben hat. Mein Problem war, dass bei der Bereitstellung auf heroku die Fehlermeldung "Der Webprozess konnte nicht innerhalb von 60 Sekunden nach dem Start an $ PORT gebunden werden" angezeigt wurde, wenn "heroku logs --tail" im Terminal ausgeführt wurde. ABER die Anwendung würde wie erwartet ausgeführt, wenn ich den Server lokal ausführen würde.

Ich hatte dies in meiner index.js-Datei (Server-Datei)

const PORT = process.env.port || 4000

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

Aber hätte das haben sollen

const PORT = process.env.PORT || 4000

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

Verwenden Sie process.env.PORT nicht process.env.port !!!! Port! = PORT !!! (offensichtlich)

Gutschrift an: gprasant

Josh Kardos
quelle