NodeJS: Come ottenere la porta del server?


142

Si vede spesso ciao esempio di codice mondiale per Node che crea un server HTTP, inizia l'ascolto su una porta, quindi seguito da qualcosa simile a:

console.log('Server is listening on port 8000');

Ma idealmente lo vorresti invece:

console.log('Server is listening on port ' + server.port);

Come recuperare la porta su cui il server è attualmente in ascolto senza memorizzare il numero in una variabile prima di chiamare server.listen()?

L'ho già visto prima, ma non lo trovo nella documentazione del nodo. Forse è qualcosa di specifico da esprimere?


3
Trova inreq.headers.host
Andrew_1510,

Risposte:


161

Risposta Express 4.x:

Express 4.x (per la risposta di Tien Do di seguito), ora considera app.listen () come un'operazione asincrona, quindi listener.address () restituirà solo i dati all'interno del callback di app.listen ():

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

var listener = app.listen(8888, function(){
    console.log('Listening on port ' + listener.address().port); //Listening on port 8888
});

Risposta Express 3:

Penso che tu stia cercando questo (espressamente specifico?):

console.log("Express server listening on port %d", app.address().port)

Potresti aver visto questo (linea di fondo), quando crei la struttura di directory dal expresscomando:

alfred@alfred-laptop:~/node$ express test4
   create : test4
   create : test4/app.js
   create : test4/public/images
   create : test4/public/javascripts
   create : test4/logs
   create : test4/pids
   create : test4/public/stylesheets
   create : test4/public/stylesheets/style.less
   create : test4/views/partials
   create : test4/views/layout.jade
   create : test4/views/index.jade
   create : test4/test
   create : test4/test/app.test.js
alfred@alfred-laptop:~/node$ cat test4/app.js 

/**
 * Module dependencies.
 */

var express = require('express');

var app = module.exports = express.createServer();

// Configuration

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.use(express.bodyDecoder());
  app.use(express.methodOverride());
  app.use(express.compiler({ src: __dirname + '/public', enable: ['less'] }));
  app.use(app.router);
  app.use(express.staticProvider(__dirname + '/public'));
});

app.configure('development', function(){
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
});

app.configure('production', function(){
  app.use(express.errorHandler()); 
});

// Routes

app.get('/', function(req, res){
  res.render('index.jade', {
    locals: {
        title: 'Express'
    }
  });
});

// Only listen on $ node app.js

if (!module.parent) {
  app.listen(3000);
  console.log("Express server listening on port %d", app.address().port)
}

1
Grazie, penso che sia esattamente quello che sto cercando. Lo accetterò non appena avrò la possibilità di provarlo. Saluti.
David Tang,

4
E se non vuoi avere quella variabile var listenerpuoi usare la callback this.address().portinternaapp.listen()
Andrei Stalbe,

Come si presenta in Express 5.x?
Diogene,

2
Puoi anche ottenere la porta ovunque in un middleware: req.socket.address (). Port
jlguenego

Solo per aggiungere ciò che ha detto @AndreiStalbe, puoi usarlo this.address.port()ma non puoi usarlo all'interno di una funzione freccia. dovrai fare la vecchia scuola app.listen(8000, function () { console.log('http://localhost:' + this.address().port); }(sì, so che i backtick sono più belli, ma non posso farli nei commenti di overflow dello stack)
WORMSS

65

In Express v3.0,

/* No longer valid */
var app = express.createServer();
app.listen();
console.log('Server running on %s', app.address().port);

non lavora più! Per Express v3.0, è necessario creare un'app e un server in questo modo:

var express = require('express');
var http = require('http');

var app = express();
var server = http.createServer(app);

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

server.listen(3000);
console.log('Express server started on port %s', server.address().port);

Mi sono imbattuto in questo problema da solo e volevo documentare la nuova sintassi. Questa e altre modifiche in Express v3.0 sono visibili su https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x


Oppure potresti semplicemente usare il vecchio metodo di creazione del server, che funziona ancora. Sembra proprio che non ci sia più un modo per accedere alla postfazione della porta. Tuttavia, poiché stai specificando tu stesso la porta nella chiamata a server.listen, in realtà non è necessario utilizzare server.address (). Port, poiché puoi semplicemente utilizzare lo stesso valore che hai passato a server.listen.
Mary Hamlin,

(Anche se ho appena letto la guida alla migrazione e ho visto che il metodo per creare un'app e un server che hai menzionato sopra è in realtà il nuovo metodo preferito.)
Mary Hamlin

3
@MaryHamlin: è utile se si sta passando 0a server.listen(), nel qual caso viene assegnato un numero di porta casuale. È possibile farlo se si eseguono più app Express su un server e non si desidera assegnare manualmente i numeri di porta.
Nate,

app.listen()restituisce anche l'istanza del server http.
Vicario,

23

Nella versione corrente (v0.5.0-pre) la porta sembra essere disponibile come proprietà sull'oggetto server, vedere http://nodejs.org/docs/v0.4.7/api/net.html#server.address

var server = http.createServer(function(req, res) {
    ...
}

server.listen(8088);
console.log(server.address());
console.log(server.address().address);
console.log(server.address().port);

uscite

{ address: '0.0.0.0', port: 8088 }
0.0.0.0
8088

22

Nel caso in cui sia necessaria una porta al momento della richiesta la gestione e l'app non siano disponibili, è possibile utilizzare questo:

request.socket.localPort

17

Se stai usando express, puoi ottenerlo dall'oggetto richiesta:

req.app.settings.port // => 8080 or whatever your app is listening at.

14

Uso in questo modo Express 4:

app.listen(1337, function(){
  console.log('Express listening on port', this.address().port);
});

Usando questo non ho bisogno di usare una variabile separata per il listener / server.


1
La migliore risposta finora! Se si utilizza ES6, non utilizzare le funzioni freccia. thissarà indefinito.
Laxmana,

9

Non è mai stato necessario richiedere il modulo http.

httpNon è necessaria un'importazione aggiuntiva di Express 3 o 4. L'assegnazione del risultato di listen()è sufficiente.

var server = require('express')();

server.get('/', function(req, res) {
  res.send("Hello Foo!");
});

var listener = server.listen(3000);
console.log('Your friendly Express server, listening on port %s', listener.address().port);
// Your friendly Express server, listening on port 3000

Ancora una volta, questo è testato in Express 3.5.1 e 4.0.0. L'importazione httpnon è mai stata necessaria. Il metodo di ascolto restituisce un oggetto server http. https://github.com/visionmedia/express/blob/master/lib/application.js#L531


6

Con l'ultimo node.js (v0.3.8-pre): ho controllato la documentazione, ispezionato l'istanza del server restituita da http.createServer () e ho letto il codice sorgente di server.listen () ...

Purtroppo, la porta viene temporaneamente memorizzata solo come variabile locale e finisce come argomento in una chiamata a process.binding ('net'). Bind () che è un metodo nativo. Non ho guardato oltre.

Sembra che non ci sia modo migliore di mantenere un riferimento al valore della porta fornito a server.listen ().


1
+1 e grazie per la ricerca. Sto accettando la risposta di Alfred da quando ha trovato la cosa esatta che stavo cercando, ma sono contento di sapere che non è nel core Node ora.
David Tang,

5

Il modo più semplice per convertire dal vecchio stile al nuovo stile (Express 3.x) è il seguente:

var server = app.listen(8080);
console.log('Listening on port: ' + server.address().port);

Pre 3.x funziona così:

/* This no longer works */
app.listen(8080);
console.log('Listening on port: ' + app.address().port);


3

Mi ponevo anche questa domanda, poi sono arrivato alla pagina di guida di Express 4.x per vedere questo esempio:

var server = app.listen(3000, function() {
   console.log('Listening on port %d', server.address().port);
});

2
Ma non so perché server.address (). Address sia sempre 0.0.0.0 sulla mia macchina di sviluppo locale (OSX).
Tien Do,

Questo dovrebbe essere aggiunto alla risposta accettata poiché Express 4.0 non considera più app.listen () come un'operazione sincrona e ora è necessario eseguire listener.address () nel callback.
RavenHursT

3

È possibile ottenere il numero di porta utilizzando server.address().port come nel seguente codice:

var http = require('http');
var serverFunction = function (req, res) {

    if (req.url == '/') {
        console.log('get method');
        res.writeHead(200, { 'content-type': 'text/plain' });
        res.end('Hello World');
    }

}
var server = http.createServer(serverFunction);
server.listen(3002, function () {
    console.log('server is listening on port:', server.address().port);
});

3
var express = require('express');    
var app = express();
    app.set('port', Config.port || 8881);
    var server = app.listen(app.get('port'), function() {
        console.log('Express server listening on port ' + server.address().port); 
    });

Ascolto del server Express sulla porta 8881


2

Se non è stato definito il numero di porta e si desidera sapere su quale porta è in esecuzione.

let http = require('http');
let _http = http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello..!')
}).listen();
console.log(_http.address().port);

Cordiali saluti, ogni volta che verrà eseguito in una porta diversa.



-1

sotto un semplice server http e come ottenere la porta di ascolto

var http = require("http");
             function onRequest(request, response) {
               console.log("Request received.");
               response.writeHead(200, {"Content-Type": "text/plain"});
               response.write("Hello World");
               response.end();
             }

             var server =http.createServer(onRequest).listen(process.env.PORT, function(){
            console.log('Listening on port '); //Listening on port 8888
        });

quindi ottenere la porta del server utilizzando:

console.log('Express server started on port %s', server.address().port);

-1
const express = require('express');                                                                                                                           
const morgan = require('morgan')
const PORT = 3000;

morgan.token('port', (req) => { 
    return req.app.locals.port; 
});

const app = express();
app.locals.port = PORT;
app.use(morgan(':method :url :port'))
app.get('/app', function(req, res) {
    res.send("Hello world from server");
});

app1.listen(PORT);

-2

Il modo più semplice è semplicemente chiamare app.get('url'), che fornisce il protocollo, il sottodominio, il dominio e la porta.

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.