NodeJS: Jak uzyskać port serwera?

142

Często widzisz przykładowy kod hello world dla Node, który tworzy serwer HTTP, zaczyna nasłuchiwać na porcie, a następnie następuje coś w rodzaju:

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

Ale najlepiej byłoby to zamiast tego:

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

Jak mogę pobrać port, na którym aktualnie nasłuchuje serwer, bez zapisywania numeru w zmiennej przed wywołaniem server.listen()?

Widziałem to już wcześniej, ale nie mogę znaleźć tego w dokumentacji Node. Może jest to coś konkretnego do wyrażenia?

David Tang
źródło
3
Znajdź wreq.headers.host
Andrew_1510

Odpowiedzi:

161

Odpowiedź Express 4.x:

Express 4.x (zgodnie z odpowiedzią Tien Do poniżej), teraz traktuje app.listen () jako operację asynchroniczną, więc listener.address () zwróci dane tylko wewnątrz wywołania zwrotnego app.listen ():

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

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

Odpowiedź Express 3:

Myślę, że szukasz tego (wyrazić konkretnie?):

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

Mogłeś to zobaczyć (podsumowanie), kiedy tworzysz strukturę katalogów za pomocą expresspolecenia:

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)
}
Alfred
źródło
1
Dzięki, myślę, że właśnie tego szukam. Przyjmuję to, gdy tylko będę miał okazję to przetestować. Twoje zdrowie.
David Tang,
4
A jeśli nie chcesz mieć tej zmiennej var listener, możesz użyć this.address().portwewnętrznego app.listen()wywołania zwrotnego
Andrei Stalbe
Jak to wygląda w Express 5.x?
Diogenes,
2
Możesz także pobrać port w dowolnym miejscu w oprogramowaniu pośrednim: req.socket.address (). Port
jlguenego
Aby dodać do tego, co powiedział @AndreiStalbe, możesz użyć, this.address.port()ale nie możesz tego użyć wewnątrz funkcji strzałki. będziesz musiał zrobić starą szkołę app.listen(8000, function () { console.log('http://localhost:' + this.address().port); }(tak, wiem, że grawerowanie jest ładniejsze, ale nie mogę ich zrobić w komentarzach przepełnienia stosu)
WORMSS
65

W express v3.0,

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

nie działa! W przypadku Express v3.0 aplikację i serwer należy utworzyć w ten sposób:

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

Sam napotkałem ten problem i chciałem udokumentować nową składnię. Ta i inne zmiany w Express v3.0 są widoczne pod adresem https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x

dgh
źródło
Lub możesz po prostu użyć starej metody tworzenia serwera, która nadal działa. Po prostu wydaje się, że nie ma już sposobu na dostęp do posłowia portu. Jednakże, ponieważ sam określasz port w wywołaniu server.listen, naprawdę nie ma potrzeby używania server.address (). Port, ponieważ możesz po prostu użyć tej samej wartości, którą przekazałeś do server.listen.
Mary Hamlin,
(Chociaż właśnie przeczytałem przewodnik migracji i zobaczyłem, że metoda tworzenia aplikacji i serwera, o której wspomniałeś powyżej, jest w rzeczywistości nową preferowaną metodą.)
Mary Hamlin,
3
@MaryHamlin: Jest to przydatne, jeśli przechodzisz 0do server.listen(), w którym to przypadku przypisywany jest losowy numer portu. Możesz to zrobić, jeśli używasz kilku aplikacji Express na jednym serwerze i nie chcesz ręcznie przypisywać numerów portów.
Nate
app.listen()zwraca również instancję serwera http.
Vicary,
23

W aktualnej wersji (v0.5.0-pre) port wydaje się być dostępny jako właściwość obiektu serwera, patrz 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);

wyjścia

{ address: '0.0.0.0', port: 8088 }
0.0.0.0
8088
Jörn Horstmann
źródło
22

W przypadku, gdy potrzebujesz portu w momencie obsługi żądania, a aplikacja nie jest dostępna, możesz użyć tego:

request.socket.localPort
user3348991
źródło
17

Jeśli korzystasz z ekspresu, możesz go pobrać z obiektu żądania:

req.app.settings.port // => 8080 or whatever your app is listening at.
chovy
źródło
14

Używam Express 4 w ten sposób:

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

Używając tego, nie muszę używać oddzielnej zmiennej dla nasłuchiwania / serwera.

Christian Landgren
źródło
1
Jak dotąd najlepsza odpowiedź! Jeśli używasz ES6, nie używaj funkcji strzałek. thisbędzie niezdefiniowana.
Laxmana,
9

Żądanie modułu http nigdy nie było konieczne.

Dodatkowy import httpnie jest konieczny w Express 3 lub 4. listen()Wystarczy przypisać wynik .

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

Ponownie jest to testowane w Express 3.5.1 i 4.0.0. Importowanie httpnigdy nie było konieczne. Metoda Listen zwraca obiekt serwera http. https://github.com/visionmedia/express/blob/master/lib/application.js#L531

james_womack
źródło
6

Z najnowszym node.js (v0.3.8-pre): sprawdziłem dokumentację, przejrzałem instancję serwera zwróconą przez http.createServer () i przeczytałem kod źródłowy server.listen () ...

Niestety, port jest przechowywany tylko tymczasowo jako zmienna lokalna i kończy jako argument w wywołaniu process.binding („net”). Bind (), która jest metodą natywną. Nie szukałem dalej.

Wygląda na to, że nie ma lepszego sposobu niż zachowanie odniesienia do wartości portu, którą podałeś do server.listen ().

Eric Bréchemier
źródło
1
+1 i dzięki za badania. Akceptuję odpowiedź Alfreda, ponieważ znalazł dokładnie to, czego szukałem, ale cieszę się, że wiem, że nie ma go teraz w rdzeniu Node.
David Tang
5

Najprostszy sposób konwersji ze starego do nowego stylu (Express 3.x) wygląda następująco:

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

Pre 3.x działa tak:

/* This no longer works */
app.listen(8080);
console.log('Listening on port: ' + app.address().port);
Waylon Flinn
źródło
5
req.headers.host.split(':')[1]
RockerFlower
źródło
3

Zadawałem sobie również to pytanie, a potem przeszedłem na stronę przewodnika po Express 4.x, aby zobaczyć ten przykład:

var server = app.listen(3000, function() {
   console.log('Listening on port %d', server.address().port);
});
Tien Do
źródło
2
Ale nie wiem, dlaczego adres server.address (). To zawsze 0.0.0.0 na mojej lokalnej maszynie programistycznej (OSX).
Tien Do
Należy to dodać do zaakceptowanej odpowiedzi, ponieważ Express 4.0 nie traktuje już app.listen () jako operacji synchronicznej i musisz teraz uruchomić listener.address () w wywołaniu zwrotnym.
RavenHursT
3

Możesz uzyskać numer portu, korzystając server.address().port z poniższego kodu:

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);
});
Shubham Verma
źródło
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); 
    });

Serwer Express nasłuchujący na porcie 8881

KARTHIKEYAN.A
źródło
2

Jeśli nie zdefiniowałeś numeru portu i chcesz wiedzieć, na którym porcie jest on uruchomiony.

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

FYI, za każdym razem będzie działać w innym porcie.

Szejk
źródło
-1

poniżej prosty serwer http i jak uzyskać port nasłuchiwania

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

następnie uzyskaj port serwera za pomocą:

console.log('Express server started on port %s', server.address().port);
Badr Bellaj
źródło
-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);
zurgl
źródło
-2

Najłatwiejszym sposobem jest po prostu zadzwonić app.get('url'), podając protokół, subdomenę, domenę i port.

Downhillski
źródło