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 ?
Antworten:
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:
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 .
quelle
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:
quelle
Es ist erwähnenswert, dass wenn Ihr Code keinen Port angibt, es kein
web
Prozess sein sollte und wahrscheinlich stattdessen einworker
Prozess.Ändern Sie also Ihre
Procfile
zu lesen (mit Ihrem spezifischen Befehl ausgefüllt):worker: YOUR_COMMAND
und dann auch auf CLI ausführen:
$ heroku scale worker=1
quelle
start
Skript in meinpackage.json
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
mit
quelle
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:
Dann können Sie den Server wie gewohnt starten:
Weitere Details finden Sie hier: https://help.heroku.com/P1AVPANS/why-is-my-node-js-app-crashing-with-an-r10-error
quelle
const port = 3000;
umconst port = process.env.PORT || 3000;
es auf Heroku arbeitetIn meinem Fall habe ich ein Beispiel von https://hapijs.com/ verwendet.
Um das Problem zu beheben, habe ich ersetzt
mit
quelle
process.env.PORT
korrekthost
angeben , aber den Parameter belassen: Sie können nicht :) siehe hier: stackoverflow.com/a/34956330/626369Ich hatte das gleiche Problem und das Ändern meines Listening-Ports von 3000 auf (process.env.PORT || 5000) löste das Problem !!
quelle
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.PORT
wird also durch ersetztundefined
und Ihr Code wird auf den Entwicklungsport zurückgesetzt, von dem Heroku nichts weiß.quelle
Die folgenden Schritte haben meine Lösung gelöst:
Bearbeiten von package.json als:
und Server.js als:
quelle
package.json
. Ich glaube, eine Aktualisierung sollte auch dieses Problem lösen.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
quelle
Ich hatte das gleiche Problem, das ich lösen konnte, indem ich 'localhost' durch IP ersetzt habe, das '0.0.0.0' ist.
quelle
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ügenprocess.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
quelle
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.
quelle
Ü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:
Wenn Ihre App gestartet wird, wird sie an den dynamisch festgelegten Wert von $ PORT gebunden.
quelle
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 vonPORT
in 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.quelle
Ich hatte das gleiche Problem, aber mit Express und Apollo-Server. Die Lösung von hier :
quelle
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.
2) Groß- und Kleinschreibung mit 'Sequelize' anstelle von 'Sequelize' beachten.
quelle
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);
quelle
In meinem Fall war weder der Port noch der Host das Problem. Unsere index.js wurde in 2 Dateien server.js unterteilt
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
quelle
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
quelle
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)
Aber hätte das haben sollen
Verwenden Sie process.env.PORT nicht process.env.port !!!! Port! = PORT !!! (offensichtlich)
Gutschrift an: gprasant
quelle