Aplikacja Node.js / Express.js działa tylko na porcie 3000


96

Mam aplikację Node.js / Express.js uruchomioną na moim serwerze, która działa tylko na porcie 3000 i próbuję dowiedzieć się, dlaczego. Oto co znalazłem:

  • Bez określenia portu ( app.listen()) aplikacja działa, ale strona internetowa się nie ładuje.
  • Na porcie 3001 ( app.listen(3001)) lub innym nieużywanym porcie aplikacja działa, ale strona internetowa nie jest ładowana.
  • Na porcie 2999 aplikacja zgłasza błąd, ponieważ coś innego używa tego portu.
  • Na porcie 3000 aplikacja działa, a strona internetowa ładuje się poprawnie.

Wiem, że aplikacje Express domyślnie korzystają z portu 3000. Ale, co dziwne, moja aplikacja działa tylko wtedy, gdy wyraźnie ustawię ją na porcie 3000 ( app.listen(3000)).

Znalazłem to w linii 220 z /usr/bin/express:

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

Robi się tak, jak wcześniej wspomniano: ustawianie portu na określony lub na 3000, jeśli nic nie zostało określone.

Jak mogę sprawić, by moja aplikacja działała na innym porcie, takim jak 8080 lub 3001?

Dzięki!

Edycja: przykład kodu (bardzo prosta aplikacja Node / Express)

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

1) A portjest wymagane przez .listen(), więc nie powinieneś próbować obejść się bez. 2) Czy podczas uruchamiania aplikacji pojawiają się jakieś błędy? A może po prostu wydaje się niedostępny z przeglądarki? 3) Czy próbujesz uzyskać dostęp do strony internetowej na tym samym komputerze z localhost:3000, localhost:3001itp? Jeśli używasz dwóch komputerów, jednego klienta i jednego serwera, musisz dodać wyjątki do zapory na serwerze, aby umożliwić Node odbieranie żądań od klienta.
Jonathan Lonowski

Jak uruchamiasz aplikację?
deitch

Czy jest szansa, że ​​uda ci się podsumować wyszorowaną / odkażoną wersję?
deitch

@Jonathan Dobrze wiedzieć .listen(). Powyżej stwierdzenie „aplikacja działa” oznacza to samo, co powiedzenie „brak błędów podczas uruchamiania aplikacji”. Kiedy mówię „strona internetowa nie ładuje się”, to tak samo, jak mówisz „niedostępna z przeglądarki”. Cały dostęp z tego samego komputera (mojego serwera). Dziękujemy za opinię.
Benjamin Martin,

1
@deitch, którego używam $ supervisor app.jslub $ PORT=[PORT] node app.jsgdy chcę ustawić zmienną portu środowiskowego. Podam przykład kodu.
Benjamin Martin,

Odpowiedzi:


118

Poniższe działa, jeśli masz coś takiego w pliku app.js:

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

Albo jawnie zakoduj swój kod, aby używać żądanego portu, na przykład:

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

Ten kod oznacza ustawienie portu na zmienną środowiskową PORTlub, jeśli tak jest, undefinedustawienie go na literał 3000.

Lub użyj swojego środowiska, aby ustawić port. Ustawienie go za pośrednictwem środowiska pomaga w określeniu między, PRODUCTIONa DEVELOPMENTtakże wiele platform jako usług używa środowiska do ustawiania portu zgodnie ze swoimi specyfikacjami, a także wewnętrznymi konfiguracjami Express. Poniżej ustawia się parę klucz = wartość środowiska, a następnie uruchamia aplikację.

$ PORT=8080 node app.js

W odniesieniu do twojego przykładu kodu, chcesz coś takiego:

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

2
To jest naprawdę dziwne. Zrobiłem co następuje: 1. Umieść app.set()kod w mojej aplikacji i zmieniłem 3000 na 8080. Nadal działa tylko na app.listen(3000). 2. Zmień zmienną portu środowiskowego na 8080 podczas uruchamiania aplikacji węzła. Nadal działa tylko dalej app.listen(3000). 3. Przeszedł do / usr / bin / express (linia 220) i zmienił 3000 na 8080. Nadal działa tylko na app.listen(3000). Dziękuję jednak za informacyjny post. Czy jest coś, co muszę ponownie uruchomić? Express nie może zostać ponownie uruchomiony z tego, co wiem, a ponowne uruchomienie aplikacji Node dzieje się za każdym razem, gdy używamnode app.js.
Benjamin Martin,

@BenjaminMartin Express jest po prostu modułem, jak każdy inny moduł, więc po prostu prosty node app.jsgo uruchomi (osobiście używam nodemonpodczas programowania i testowania. To, o czym możesz pomyśleć, to expressplik wykonywalny wiersza polecenia, który jest procesem pomocniczym, który buduje twój szkielet struktura pliku. Czy możesz opublikować
streszczenie

rozumiem. Zwykle używam tylko nodemonw połączeniu z, nohupaby moja aplikacja działała przez czas nieokreślony. Nie używam wersji wykonywalnej CL programu, expresswięc musi być uruchamiany ponownie za każdym razem, gdy ponownie uruchamiam nodeaplikację. Zobacz mój oryginalny post dotyczący zmiany z kodem. Dzięki!
Benjamin Martin,

@BenjaminMartin sprawdź dolną część mojej odpowiedzi i uruchom ten kod. To powinno działać dobrze. Właśnie przetestowałem to na moim komputerze.
EhevuTov

Jest to kolejny przydatny sposób zmiany portu, ale działa tylko wtedy, gdy port ma wartość 3000. Zaczynam się zastanawiać, czy na moim serwerze jest coś, co pozwala na udostępnianie treści tylko na określonych portach. Nie mam jednak pojęcia, gdzie byłaby zlokalizowana ta konfiguracja. Czy to może być problem? FYI Używam Ubuntu 10.04.
Benjamin Martin

31

W bin/wwwjest wiersz:

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

Spróbuj to zmodyfikować.


1
Próbowałem ustawić port w app.js, ale ta linia była nadrzędna. To jest właściwe miejsce na zmianę portu.
Neil

12

Spróbuj tego

$ PORT=8080 node app.js

1
Dzięki za odpowiedź - działa to tylko wtedy, gdy mam app.listen (3000) ustawioną w app.js. Innymi słowy, ustawienie portu, gdy uruchamiam aplikację, tak jak to zrobiłeś, nie zastępuje app.listen ().
Benjamin Martin

Idealny. Używam jest z express: PORT = 8000 npm start. Możesz więc używać tego, co chcesz: D.
Johan Hoeksma


9

Domyślnym sposobem zmiany portu nasłuchiwania w środowisku Express jest zmodyfikowanie pliku o nazwie www w folderze bin.

Znajdziesz tam linię taką jak poniższa

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

Zmień wartość 3000 na dowolny port.

Dotyczy to wersji Express 4.13.1


4

Tylko uwaga dla użytkowników Mac OS X i Linux:

Jeśli chcesz uruchomić aplikację Node / Express na porcie o numerze niższym niż 1024, musisz działać jako administrator: sudo PORT=80 node app.js


2
Lepszą opcją uruchamiania aplikacji na porcie poniżej 1024 jest przekierowanie portu o większej liczbie. Używanie sudo w celu uzyskania dostępu do portu o numerze niższym niż 1024 jest ogólnie uważane za złą praktykę.
Pieter VDE

4

W najnowszej wersji kodu z generatorem ekspresowym (4.13.1) app.js jest eksportowanym modułem, a serwer jest uruchamiany w / bin / www za pomocą app.set ('port', process.env.PORT || 3001) w app.js zostanie zastąpiona podobną instrukcją w bin / www. Właśnie zmieniłem oświadczenie w bin / www.


2

Zauważyłem, że to nigdy nie zostało rozwiązane ... Prawdopodobnie masz przed komputerem zaporę ogniową blokującą te porty lub skonfigurowano iptables, aby uniemożliwić korzystanie z tych portów.

Spróbuj uruchomić nmap -F localhost podczas uruchamiania aplikacji (zainstaluj nmap, jeśli go nie masz). Jeśli wydaje się, że uruchamiasz aplikację na odpowiednim porcie i nie możesz uzyskać do niej dostępu przez zdalną przeglądarkę, oznacza to, że istnieje oprogramowanie pośredniczące lub fizyczna zapora, która blokuje port.

Mam nadzieję że to pomoże!


To mi się udało. Zapomniałem zezwolić na port.
lalilulelost

2

Linia, którą znalazłeś, po prostu szuka zmiennej środowiskowej PORT, jeśli jest zdefiniowana, używa jej, w przeciwnym razie używa domyślnego portu 3000. Musisz najpierw zdefiniować tę zmienną środowiskową (nie musisz być rootem)

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

2

Jeśli chcesz coś pokazać, jesteś połączony na 3000

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

Mam nadzieję, że okaże się to pomocne


1

Odpowiedz zgodnie z aktualną wersją express

Jeśli mówisz o aktualnej wersji Express , jeśli uruchomisz app.listen()nasłuchiwanie bez określania portu, Express wybierze losowy port dla twojej aplikacji, aby dowiedzieć się, który port jest aktualnie używany

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

Should wyjście portu twoich app. Ponadto ten pierwszy parametr 0można całkowicie zignorować, ale nie jest zalecany



0

minimistDo sterowania portem używam pakietu i argumentów startowych węzła.

node server.js --port 4000

lub

node server.js -p 4000

Wewnątrz server.js port można określić przez

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

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

//....listen(port);

i domyślnie 3000, jeśli żaden port nie zostanie przekazany jako argument.

Następnie możesz użyć nasłuchu na portzmiennej.


0

W app.js, po prostu dodaj ...

process.env.PORT=2999;

Spowoduje to odizolowanie zmiennej PORT do aplikacji ekspresowej.


0

Myślę, że najlepszym sposobem jest użycie pakietu dotenv i ustawienie portu w .envpliku konfiguracyjnym bez modyfikowania pliku wwwwewnątrz folderu bin.

Wystarczy zainstalować pakiet za pomocą polecenia:

npm install dotenv

wymagaj tego w swojej aplikacji:

require('dotenv').config()

Utwórz plik .env w katalogu głównym projektu i dodaj w nim port (na przykład), aby nasłuchiwać na porcie 5000

PORT=5000

i to wszystko.

Więcej informacji tutaj


0

Jeśli używasz Nodemon, przypuszczam, że PORT 3000 jest ustawiony w nodemonConfig. Sprawdź, czy tak jest.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.