L'app Node.js / Express.js funziona solo sulla porta 3000


97

Ho un'app Node.js / Express.js in esecuzione sul mio server che funziona solo sulla porta 3000 e sto cercando di capire perché. Ecco cosa ho trovato:

  • Senza specificare una porta ( app.listen()), l'app viene eseguita ma la pagina Web non viene caricata.
  • Sulla porta 3001 ( app.listen(3001)) o su qualsiasi altra porta non in uso, l'app viene eseguita ma la pagina Web non viene caricata.
  • Sulla porta 2999, l'app genera un errore perché qualcos'altro sta usando quella porta.
  • Sulla porta 3000, l'app viene eseguita e la pagina Web viene caricata correttamente.

So che le app Express utilizzano per impostazione predefinita la porta 3000. Ma stranamente, la mia app viene eseguita solo quando la eseguo esplicitamente sulla porta 3000 ( app.listen(3000)).

Ho trovato questo sulla linea 220 di /usr/bin/express:

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

Che sta facendo come detto in precedenza: impostare la porta su quanto specificato o su 3000 se non viene specificato nulla.

Come posso far funzionare la mia app su una porta diversa come 8080 o 3001?

Grazie!

Modifica: codice di esempio (nodo molto semplice / app 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 portè richiesto da .listen(), quindi non dovresti provare a farne a meno. 2) Ricevi errori durante l'esecuzione dell'applicazione? O sembra semplicemente inaccessibile da un browser? 3) Si sta tentando di accedere al sito web sulla stessa macchina con localhost:3000, localhost:3001e così via? Se stai utilizzando due macchine, un client e un server, dovrai aggiungere eccezioni al firewall sul server per consentire a Node di ricevere richieste dal client.
Jonathan Lonowski

Come lanci l'app?
deitch

C'è qualche possibilità che tu possa mettere una versione ripulita / disinfettata in un succo?
deitch

@ Jonathan Buono a sapersi .listen(). Sopra quando dico "l'app viene eseguita", è come se dicessi "nessun errore durante l'esecuzione dell'applicazione". Quando dico "la pagina web non si carica", è come se dicessi "inaccessibile da un browser". Tutti gli accessi dalla stessa macchina (il mio server). Grazie per il feedback.
Benjamin Martin

1
@deitch che sto usando $ supervisor app.jso $ PORT=[PORT] node app.jsquando voglio impostare la variabile della porta d'ambiente. Metterò un esempio di codice.
Benjamin Martin

Risposte:


118

Quanto segue funziona se hai qualcosa di simile nel tuo app.js:

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

O codifica esplicitamente il tuo codice per utilizzare la porta che desideri, come:

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

Questo codice significa impostare la porta sulla variabile di ambiente PORTo, se è presente, undefinedimpostarla sul valore letterale 3000.

In alternativa, utilizza il tuo ambiente per impostare la porta. L'impostazione tramite l'ambiente viene utilizzata per aiutare a delineare tra PRODUCTIONe DEVELOPMENTanche molte piattaforme come servizio utilizzano l'ambiente per impostare la porta in base alle loro specifiche e alle configurazioni Express interne. Quanto segue imposta una coppia chiave di ambiente = valore e quindi avvia l'app.

$ PORT=8080 node app.js

In riferimento al tuo esempio di codice, vuoi qualcosa del genere:

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
Questo è davvero strano. Ho fatto quanto segue: 1. Metti il app.set()codice nella mia app e ho cambiato 3000 in 8080. Funziona ancora solo su app.listen(3000). 2. Modificare la variabile della porta di ambiente in 8080 quando si esegue l'app del nodo. Funziona ancora solo app.listen(3000). 3. Andato a / usr / bin / express (linea 220) e cambiato da 3000 a 8080. Funziona ancora solo su app.listen(3000). Grazie per il post informativo però. C'è qualcosa che devo riavviare? Express non può essere riavviato da quello che posso dire e il riavvio dell'app Node avviene ogni volta che lo usonode app.js.
Benjamin Martin

@BenjaminMartin Express è solo un modulo come qualsiasi altro modulo, quindi solo un semplice node app.jslo avvierà (io personalmente uso nodemondurante lo sviluppo e il test. Quello a cui potresti pensare è ilexpress eseguibile da riga di comando che è un processo di supporto che costruisce il tuo scheletro struttura del file. Puoi pubblicare una sintesi del tuo codice?
EhevuTov

gotcha. Di solito lo uso solo nodemonin combinazione connohup per mantenere la mia app in esecuzione a tempo indeterminato. Non sto utilizzando la versione eseguibile CL di expressquindi deve essere riavviata ogni volta che riavvio la mia nodeapp. Vedi il mio post originale per una modifica con il codice. Grazie!
Benjamin Martin

@BenjaminMartin controlla in fondo alla mia risposta ed esegui quel codice. Dovrebbe funzionare bene. L'ho appena testato sulla mia macchina.
EhevuTov

Questo è un altro modo utile per cambiare la porta, ma funziona ancora solo quando la porta è 3000. Comincio a chiedermi se c'è qualcosa sul mio server che consente di servire il contenuto solo su determinate porte. Tuttavia, non ho idea di dove si troverebbe questa configurazione. Potrebbe essere un problema? Cordiali saluti, sto eseguendo Ubuntu 10.04.
Benjamin Martin

31

In bin/www, c'è una linea:

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

Prova a modificarlo.


1
Ho provato a impostare la porta in app.js ma questa linea stava sovrascrivendo. Questo è il posto corretto per cambiare la porta.
Neil

12

Prova questo

$ PORT=8080 node app.js

1
Grazie per la risposta: funziona solo se ho app.listen (3000) impostato in app.js. In altre parole, l'impostazione della porta quando eseguo l'app come hai fatto non sembra sovrascrivere app.listen ().
Benjamin Martin

Perfetto. Io uso è con express: PORT = 8000 npm start. Quindi puoi usare quello che vuoi: D.
Johan Hoeksma

10

Fare riferimento a questo collegamento.

Prova a individuare il percorso bin> www e prova a cambiare il numero di porta ...


9

Il modo predefinito per modificare la porta di ascolto sul framework Express è modificare il file denominato www nella cartella bin.

Lì troverai una riga come la seguente

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

Modificare il valore 3000 in qualsiasi porta si desideri.

Questo è valido per la versione Express 4.13.1


4

Solo una nota per gli utenti Mac OS X e Linux:

Se vuoi eseguire la tua app Node / Express su un numero di porta inferiore a 1024, devi eseguire come superutente: sudo PORT=80 node app.js


2
Un'opzione migliore per eseguire l'app su una porta inferiore a 1024 è l'inoltro di una porta con un numero maggiore. L'utilizzo di sudo per poter accedere a un numero di porta inferiore a 1024 è generalmente considerato una cattiva pratica.
Pieter VDE

4

Nell'ultima versione di codice con express-generator (4.13.1) app.js è un modulo esportato e il server viene avviato in / bin / www usando app.set ('port', process.env.PORT || 3001) in app.js verrà sovrascritto da un'istruzione simile in bin / www. Ho appena cambiato l'istruzione in bin / www.


2

Ho notato che questo non è mai stato risolto ... Probabilmente hai un firewall davanti alla tua macchina che blocca quelle porte, o iptables è impostato per impedire l'uso di quelle porte.

Prova a eseguire nmap -F localhost quando esegui la tua app (installa nmap se non ce l'hai). Se sembra che stai eseguendo l'app sulla porta corretta e non puoi accedervi tramite un browser remoto, allora c'è del middleware o un firewall fisico che blocca la porta.

Spero che questo ti aiuti!


Questo è ciò che ha funzionato per me. Hai dimenticato di consentire il porto.
lalilulelost

2

La riga che hai trovato cerca solo la variabile d'ambiente PORT, se è definita la usa, altrimenti usa la porta predefinita 3000. Devi prima definire questa variabile ambientale (non è necessario essere root)

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

2

Se vuoi mostrare qualcosa che sei connesso su 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!')
})

Spero che ti sarà utile


1

Rispondi in base alla versione corrente di Express

Se parli della versione corrente di express , se corri app.listen()per iniziare ad ascoltare senza specificare la porta, Express sceglierà una porta casuale per la tua applicazione, per scoprire su quale porta è attualmente in esecuzione in uso

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

dovrebbe produrre la porta del tuo app. Inoltre quel primo parametro 0può essere totalmente ignorato ma non è consigliato


0

Assicurati di eseguire da quella cartella della tua applicazione, dove hai il package.json.


0

Sto usando il minimistpacchetto e gli argomenti di avvio del nodo per controllare la porta.

node server.js --port 4000

o

node server.js -p 4000

All'interno di server.js, la porta può essere determinata da

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

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

//....listen(port);

e il valore predefinito è 3000 se nessuna porta viene passata come argomento.

È quindi possibile utilizzare l'ascolto sulla portvariabile.


0

In app.js, aggiungi semplicemente ...

process.env.PORT=2999;

Questo isolerà la variabile PORT per l'applicazione express.


0

Penso che il modo migliore sia usare il pacchetto dotenv e impostare la porta sul .envfile di configurazione senza modificare il file wwwall'interno della cartella bin.

Basta installare il pacchetto con il comando:

npm install dotenv

richiedilo sulla tua applicazione:

require('dotenv').config()

Crea un file .env nella directory principale del tuo progetto e aggiungi la porta al suo interno (ad esempio) per ascoltare sulla porta 5000

PORT=5000

e questo è tutto.

Maggiori info qui


0

Se stai usando Nodemon, la mia ipotesi è che PORT 3000 sia impostato in nodemonConfig. Controlla se è così.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.