650 Stimmen

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

Ich habe meine erste node.js app (läuft gut lokal) - aber ich bin nicht in der Lage, es über heroku bereitstellen (zum ersten Mal w / heroku als gut). Der Code ist unten. SO lässt mich nicht so viel Code zu schreiben, so würde ich nur sagen, dass die Ausführung des Codes lokal als auch in meinem Netzwerk zeigt kein Problem.

 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?

1393voto

redhotvengeance Punkte 26446

Heroku weist Ihrer App dynamisch einen Port zu, Sie können den Port also nicht auf eine feste Zahl setzen. Heroku fügt den Port der Umgebungsvariable hinzu, sodass Sie ihn von dort abrufen können. Stellen Sie Ihren Listener auf dies um:

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

Auf diese Weise wird es immer noch auf Port 5000 hören, wenn Sie lokal testen, aber es wird auch auf Heroku funktionieren. Wichtiger Hinweis - PORT Wort muss groß geschrieben werden.

Sie können sich die Heroku-Dokumente zu Node.js ansehen ici .

89voto

zthomas.nc Punkte 3196

Es ist erwähnenswert, dass, wenn Ihr Code keinen Port angibt, er sollte nicht ein web Prozess und sollte wahrscheinlich ein worker Prozess.

Also, ändern Sie Ihre Procfile zu lesen (mit dem von Ihnen eingegebenen Befehl):

worker: YOUR_COMMAND

und dann auch auf CLI laufen:

heroku scale worker=1

63voto

gregb Punkte 732

Für diejenigen, die sowohl einen Port als auch einen Host angeben, ist zu beachten, dass Heroku bindet nicht an localhost .

Sie müssen bestehen 0.0.0.0 für Gastgeber.

Auch wenn Sie den richtigen Anschluss 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 Einzelheiten können Sie hier einsehen: https://help.heroku.com/P1AVPANS/why-is-my-node-js-app-crashing-with-an-r10-error

58voto

Royce Lee Punkte 581

Der Fehler tritt auf, wenn Heroku den Port oder den Hostnamen nicht binden können unter server.listen(port, [host], [backlog], [callback]) .

Heroku benötigt Folgendes .listen(process.env.PORT) o .listen(process.env.PORT, '0.0.0.0')

Um andere Umgebungen zu unterstützen, können Sie dies verwenden:

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

29voto

vinesh Punkte 4495

Ich hatte das gleiche Problem bei der Verwendung von Yeoman's angular-fullstack generiert Projekt und Entfernen der IP-Parameter für mich gearbeitet.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X