Node.js / Express.js App funktioniert nur auf Port 3000

97

Ich habe eine Node.js / Express.js-App auf meinem Server, die nur auf Port 3000 funktioniert, und ich versuche herauszufinden, warum. Folgendes habe ich gefunden:

  • Ohne Angabe eines Ports ( app.listen()) wird die App ausgeführt, die Webseite wird jedoch nicht geladen.
  • Auf Port 3001 ( app.listen(3001)) oder einem anderen Port, der nicht verwendet wird, wird die App ausgeführt, aber die Webseite wird nicht geladen.
  • Auf Port 2999 gibt die App einen Fehler aus, da dieser Port von einem anderen Benutzer verwendet wird.
  • Auf Port 3000 wird die App ausgeführt und die Webseite wird einwandfrei geladen.

Ich weiß, dass Express-Apps standardmäßig Port 3000 verwenden. Seltsamerweise wird meine App nur ausgeführt, wenn ich sie explizit auf Port 3000 ( app.listen(3000)) ausführen lasse .

Ich fand dies in Zeile 220 von /usr/bin/express:

app.set(\'port\', process.env.PORT || 3000);

Dies geschieht wie zuvor angegeben: Setzen Sie den Port auf den angegebenen Wert oder auf 3000, wenn nichts angegeben ist.

Wie kann ich meine App an einem anderen Port wie 8080 oder 3001 zum Laufen bringen?

Vielen Dank!

Bearbeiten: Codebeispiel (Sehr einfache Node / Express App)

var express = require("express");
var app = express();

app.get('/', function(req, res){
    res.send('hello world'); 
});

// Only works on 3000 regardless of what I set environment port to or how I set [value] in app.set('port', [value]).
app.listen(3000);
Benjamin Martin
quelle
1) A portwird von benötigt .listen(), daher sollten Sie nicht versuchen, darauf zu verzichten. 2) Erhalten Sie Fehler beim Ausführen der Anwendung? Oder scheint es nur über einen Browser unzugänglich zu sein? 3) Sind Sie versuchen, die Website auf der gleichen Maschine zuzugreifen mit localhost:3000, localhost:3001usw.? Wenn Sie zwei Computer verwenden, einen Client und einen Server, müssen Sie der Firewall auf dem Server Ausnahmen hinzufügen, damit Node Anforderungen vom Client empfangen kann.
Jonathan Lonowski
Wie startest du die App?
Gottheit
Gibt es eine Chance, dass Sie eine geschrubbte / bereinigte Version auf den Punkt bringen können?
Gottheit
@ Jonathan Gut zu wissen .listen(). Wenn ich oben "Die App wird ausgeführt" sage, ist dies dasselbe wie Sie sagen: "Keine Fehler beim Ausführen der Anwendung". Wenn ich sage, "Webseite wird nicht geladen", ist dies dasselbe wie Sie sagen, "über einen Browser nicht zugänglich". Alle greifen von demselben Computer (meinem Server) zu. Danke für die Rückmeldung.
Benjamin Martin
1
@deitch Ich verwende $ supervisor app.jsoder $ PORT=[PORT] node app.jswenn ich die Umgebungsportvariable festlegen möchte. Ich werde ein Codebeispiel erstellen.
Benjamin Martin

Antworten:

118

Folgendes funktioniert, wenn Sie so etwas in Ihrer app.js haben:

http.createServer(app).listen(app.get('port'),
  function(){
    console.log("Express server listening on port " + app.get('port'));
});

Entweder codieren Sie Ihren Code explizit fest, um den gewünschten Port zu verwenden, wie z.

app.set('port', process.env.PORT || 3000);

Dieser Code bedeutet, dass Sie Ihren Port auf die Umgebungsvariable setzen PORToder, falls dies der Fall ist undefined, auf das Literal 3000.

Oder verwenden Sie Ihre Umgebung, um den Port festzulegen. Das Festlegen über die Umgebung wird verwendet, um die Abgrenzung zwischen PRODUCTIONund DEVELOPMENTund vielen Plattformen als Dienst zu erleichtern. Verwenden Sie die Umgebung, um den Port gemäß ihren Spezifikationen sowie internen Express-Konfigurationen festzulegen. Im Folgenden wird ein Umgebungsschlüssel-Wert-Paar festgelegt und anschließend Ihre App gestartet.

$ PORT=8080 node app.js

In Bezug auf Ihr Codebeispiel möchten Sie ungefähr Folgendes:

var express = require("express");
var app = express();

// sets port 8080 to default or unless otherwise specified in the environment
app.set('port', process.env.PORT || 8080);

app.get('/', function(req, res){
    res.send('hello world');
});

// Only works on 3000 regardless of what I set environment port to or how I set
// [value] in app.set('port', [value]).
// app.listen(3000);
app.listen(app.get('port'));
EhevuTov
quelle
2
Das ist wirklich komisch. Ich habe Folgendes getan: 1. Geben Sie den app.set()Code in meine App ein und ändern Sie 3000 in 8080. Funktioniert immer noch nur app.listen(3000). 2. Ändern Sie die Umgebungsportvariable in 8080, wenn Sie die Knoten-App ausführen. Funktioniert immer noch nur weiter app.listen(3000). 3. Gehen Sie zu / usr / bin / express (Zeile 220) und ändern Sie 3000 zu 8080. Funktioniert immer noch nur app.listen(3000). Vielen Dank für den informativen Beitrag. Muss ich etwas neu starten? Express kann nicht von dem neu gestartet werden, was ich sagen kann, und der Neustart der Node-App erfolgt jedes Mal, wenn ich sie benutzenode app.js.
Benjamin Martin
@BenjaminMartin Express ist nur ein Modul wie jedes andere Modul, daher wird es nur mit einem einfachen Modul node app.jsgestartet (ich persönlich verwende es nodemonbeim Entwickeln und Testen. Was Sie vielleicht denken, ist die expressausführbare Befehlszeile, die ein Hilfsprozess ist, der Ihr Skelett aufbaut Dateistruktur. Können Sie einen Kern Ihres Codes
posten
Erwischt. Normalerweise verwende ich nur nodemonin Verbindung mit nohup, um meine App unbegrenzt laufen zu lassen. Ich verwende nicht die ausführbare CL-Version von, expressdaher muss sie jedes Mal neu gestartet werden, wenn ich meine nodeApp neu starte. Siehe meinen ursprünglichen Beitrag für eine Bearbeitung mit Code. Vielen Dank!
Benjamin Martin
@BenjaminMartin Überprüfen Sie den unteren Rand meiner Antwort und führen Sie diesen Code aus. Das sollte gut funktionieren. Ich habe es gerade auf meiner Maschine getestet.
EhevuTov
Dies ist ein weiterer nützlicher Weg, um den Port zu ändern, aber er funktioniert immer noch nur, wenn der Port 3000 ist. Ich frage mich, ob auf meinem Server etwas vorhanden ist, das nur die Bereitstellung von Inhalten an bestimmten Ports ermöglicht. Ich habe jedoch keine Ahnung, wo sich diese Konfiguration befinden würde. Könnte dies ein Problem sein? Zu Ihrer Information: Ich verwende Ubuntu 10.04.
Benjamin Martin
30

In bin/wwwgibt es eine Zeile:

var port = normalizePort(process.env.PORT || '3000');

Versuchen Sie es zu ändern.

Larry Lu
quelle
1
Ich habe versucht, den Port in app.js festzulegen, aber diese Zeile wurde überschrieben. Dies ist der richtige Ort, um den Port zu ändern.
Neil
12

Versuche dies

$ PORT=8080 node app.js
John Williams
quelle
1
Vielen Dank für die Antwort - dies funktioniert nur, wenn ich app.listen (3000) in app.js gesetzt habe. Mit anderen Worten, das Festlegen des Ports beim Ausführen der App, wie Sie es getan haben, scheint app.listen () nicht zu überschreiben.
Benjamin Martin
Perfekt. Ich benutze ist mit Express: PORT = 8000 npm Start. Sie können also verwenden, was Sie wollen: D.
Johan Hoeksma
10

Siehe diesen Link.

Versuchen Sie, den Speicherort bin> www zu finden und die Portnummer zu ändern ...

Abhishek Gautam
quelle
9

Die Standardmethode zum Ändern des Überwachungsports im Express-Framework besteht darin, die Datei mit dem Namen www im Ordner bin zu ändern.

Dort finden Sie eine Zeile wie die folgende

var port = normalizePort(process.env.PORT || '3000');

Ändern Sie den Wert 3000 in einen beliebigen Port.

Dies gilt für Express Version 4.13.1

AliAvci
quelle
4

Nur ein Hinweis für Mac OS X- und Linux-Benutzer:

Wenn Sie Ihre Node / Express-App auf einer Portnummer unter 1024 ausführen möchten, müssen Sie als Superuser ausgeführt werden: sudo PORT=80 node app.js

user3711307
quelle
2
Eine bessere Option, um Ihre App auf einem Port unter 1024 auszuführen, besteht darin, einen Port mit einer größeren Anzahl weiterzuleiten. Die Verwendung von sudo, um auf eine Portnummer unter 1024 zugreifen zu können, wird im Allgemeinen als schlechte Praxis angesehen.
Pieter VDE
4

In der neuesten Version des Codes mit Express-Generator (4.13.1) ist app.js ein exportiertes Modul und der Server wird in / bin / www mit app.set ('port', process.env.PORT || 3001) gestartet. in app.js wird durch eine ähnliche Anweisung in bin / www überschrieben. Ich habe gerade die Anweisung in bin / www geändert.

user1276682
quelle
2

Es wurde festgestellt, dass dies nie behoben wurde ... Sie haben wahrscheinlich eine Firewall vor Ihrem Computer, die diese Ports blockiert, oder iptables ist eingerichtet, um die Verwendung dieser Ports zu verhindern.

Versuchen Sie, nmap -F localhost auszuführen, wenn Sie Ihre App ausführen (installieren Sie nmap, wenn Sie es nicht haben). Wenn sich herausstellt, dass Sie die App auf dem richtigen Port ausführen und nicht über einen Remote-Browser darauf zugreifen können, gibt es eine Middleware oder eine physische Firewall, die den Port blockiert.

Hoffe das hilft!

user2855232
quelle
Das hat bei mir funktioniert. Ich habe vergessen, den Port zuzulassen.
lalilulelost
2

Die gefundene Zeile sucht nur nach der Umgebungsvariablen PORT. Wenn sie definiert ist, wird sie verwendet, andernfalls wird der Standardport verwendet 3000. Sie müssen diese Umgebungsvariable zuerst definieren (Sie müssen nicht root sein).

export PORT=8080
node <your-app.js>
Dinigo
quelle
2

Wenn Sie etwas zeigen möchten, sind Sie mit 3000 verbunden

var express = require('express')
var app = express()

app.get('/', function (req, res) {
  res.send('Hello World!')
})

app.listen(3000, function () {
  console.log('Example app listening on port 3000!')
})

Ich hoffe das wird dir hilfreich sein

MEAbid
quelle
1

Antwort gemäß aktueller Version von Express

Wenn Sie über die aktuelle Version von Express sprechen und laufen app.listen(), um das Abhören ohne Angabe des Ports zu starten, wählt Express einen zufälligen Port für Ihre Anwendung aus, um herauszufinden, welcher Port derzeit verwendet wird

app.listen(0, () => {
    console.log(app.address().port)
}

sollte den Port Ihres ausgeben . Darüber hinaus kann dieser erste Parameter vollständig ignoriert werden, wird jedoch nicht empfohlenapp0

Syed Huzaifa Hassan
quelle
0

Stellen Sie sicher, dass Sie in dem Ordner Ihrer Anwendung ausgeführt werden, in dem Sie die Datei package.json haben.

Shreeparna Sarkar
quelle
0

Ich verwende das minimistPaket und die Knotenstartargumente, um den Port zu steuern.

node server.js --port 4000

oder

node server.js -p 4000

In server.js kann der Port durch bestimmt werden

var argv = parseArgs(process.argv.slice(2))

const port = argv.port || argv.p || 3000;
console.log(`Listening on port ${port}...`)

//....listen(port);

Der Standardwert ist 3000, wenn kein Port als Argument übergeben wird.

Sie können dann die portVariable abhören .

Williamli
quelle
0

Fügen Sie in app.js einfach ...

process.env.PORT=2999;

Dadurch wird die PORT-Variable für die Express-Anwendung isoliert.

Mark Longmire
quelle
0

Ich denke, der beste Weg ist, das dotenv- Paket zu verwenden und den Port für die .envKonfigurationsdatei festzulegen , ohne die Datei wwwim Ordner zu ändern bin.

Installieren Sie einfach das Paket mit dem Befehl:

npm install dotenv

benötigen Sie es in Ihrer Bewerbung:

require('dotenv').config()

Erstellen Sie eine .env-Datei im Stammverzeichnis Ihres Projekts und fügen Sie den Port hinzu (zum Beispiel), um Port 5000 abzuhören

PORT=5000

und das ist es.

Mehr Infos hier

Huckbit
quelle
0

Wenn Sie Nodemon verwenden, ist der PORT 3000 vermutlich in der nodemonConfig festgelegt. Überprüfen Sie, ob dies der Fall ist.

Samuel Adranyi
quelle