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);
Benjamin Martin
źródło
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'));
EhevuTov
źródło
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ć.

Larry Lu
źródło
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
John Williams
źródło
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
10

Skorzystaj z tego łącza.

Spróbuj zlokalizować lokalizację bin> www i spróbuj zmienić numer portu ...

Abhishek Gautam
źródło
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

AliAvci
źródło
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

user3711307
źródło
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.

user1276682
źródło
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!

user2855232
źródło
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>
dinigo
źródło
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

MEAbid
źródło
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

Syed Huzaifa Hassan
źródło
0

Upewnij się, że korzystasz z tego folderu aplikacji, w którym znajduje się plik package.json.

Shreeparna Sarkar
źródło
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.

williamli
źródło
0

W app.js, po prostu dodaj ...

process.env.PORT=2999;

Spowoduje to odizolowanie zmiennej PORT do aplikacji ekspresowej.

Mark Longmire
źródło
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

huckbit
źródło
0

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

Samuel Adranyi
źródło