NodeJS: Wie erhalte ich den Port des Servers?

142

Sie sehen häufig ein Beispiel für einen Hallo-Weltcode für Node, der einen HTTP-Server erstellt, einen Port abhört und anschließend Folgendes folgt:

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

Aber im Idealfall möchten Sie stattdessen Folgendes:

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

Wie rufe ich den Port ab, den der Server gerade abhört, ohne die Nummer vor dem Aufruf in einer Variablen zu speichern? server.listen() ?

Ich habe dies schon einmal gesehen, kann es aber nicht in der Knotendokumentation finden. Vielleicht ist es etwas Spezielles auszudrücken?

David Tang
quelle
3
Finden Sie inreq.headers.host
Andrew_1510

Antworten:

160

Express 4.x Antwort:

Express 4.x (gemäß der Antwort von Tien Do unten) behandelt app.listen () jetzt als asynchrone Operation, sodass listener.address () nur Daten innerhalb des Rückrufs von app.listen () zurückgibt:

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

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

Express 3 Antwort:

Ich denke, Sie suchen dies (ausdrücklich spezifisch?):

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

Möglicherweise haben Sie dies gesehen (unter dem Strich), wenn Sie eine Verzeichnisstruktur aus dem expressBefehl erstellen :

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
quelle
1
Danke, ich denke genau das suche ich. Ich werde es akzeptieren, sobald ich die Gelegenheit habe, es zu testen. Prost.
David Tang
4
Und wenn Sie diese Variable nicht haben möchten, können var listenerSie this.address().portinnerhalb des app.listen()Rückrufs verwenden
Andrei Stalbe
Wie sieht das in Express 5.x aus?
Diogenes
2
Sie können den Port auch überall in einer Middleware abrufen: req.socket.address (). Port
jlguenego
Nur um das zu ergänzen, was @AndreiStalbe gesagt hat, können Sie es verwenden, this.address.port()aber Sie können es nicht innerhalb einer Pfeilfunktion verwenden . Sie müssen Old School machen app.listen(8000, function () { console.log('http://localhost:' + this.address().port); }(ja, ich weiß, Backticks sind schöner, aber ich kann sie nicht in Stack-Überlauf-Kommentaren machen)
WORMSS
65

In Express v3.0,

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

funktioniert nicht mehr! Für Express v3.0 sollten Sie eine App und einen Server folgendermaßen erstellen:

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

Ich bin selbst auf dieses Problem gestoßen und wollte die neue Syntax dokumentieren. Diese und andere Änderungen in Express v3.0 sind unter https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x sichtbar

dgh
quelle
Oder Sie können einfach die alte Methode zum Erstellen des Servers verwenden, die immer noch funktioniert. Es scheint einfach keine Möglichkeit mehr zu geben, auf das Port-Nachwort zuzugreifen. Da Sie den Port jedoch beim Aufruf von server.listen selbst angeben, muss server.address (). Port nicht verwendet werden, da Sie nur denselben Wert verwenden können, den Sie an server.listen übergeben haben.
Mary Hamlin
(Obwohl ich gerade den Migrationsleitfaden gelesen habe und festgestellt habe, dass die oben erwähnte Methode zum Erstellen einer App und eines Servers tatsächlich die neue bevorzugte Methode ist.)
Mary Hamlin
3
@ MaryHamlin: Dies ist nützlich, wenn Sie 0an übergeben server.listen(). In diesem Fall wird eine zufällige Portnummer zugewiesen. Sie können dies tun, wenn Sie mehrere Express-Apps auf einem Server ausführen und die Portnummern nicht manuell zuweisen möchten.
Nate
app.listen()Gibt auch die http-Serverinstanz zurück.
Vicary
23

In der aktuellen Version (v0.5.0-pre) scheint der Port als Eigenschaft für das Serverobjekt verfügbar zu sein, siehe 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);

Ausgänge

{ address: '0.0.0.0', port: 8088 }
0.0.0.0
8088
Jörn Horstmann
quelle
22

Falls Sie zum Zeitpunkt der Anforderungsbearbeitung einen Port benötigen und die App nicht verfügbar ist, können Sie Folgendes verwenden:

request.socket.localPort
user3348991
quelle
17

Wenn Sie Express verwenden, können Sie es vom Anforderungsobjekt abrufen:

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

Ich benutze diesen Weg Express 4:

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

Auf diese Weise muss ich keine separate Variable für den Listener / Server verwenden.

Christian Landgren
quelle
1
Beste Antwort bisher! Wenn Sie ES6 verwenden, verwenden Sie keine Pfeilfunktionen. thiswird undefiniert sein.
Laxmana
9

Das Erfordernis des http-Moduls war nie erforderlich.

Ein zusätzlicher Import von httpist in Express 3 oder 4 nicht erforderlich. Das Zuweisen des Ergebnisses von listen()ist ausreichend.

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

Dies wird wiederum in Express 3.5.1 und 4.0.0 getestet. Der Import httpwar nie notwendig. Die Listen-Methode gibt ein http-Server-Objekt zurück. https://github.com/visionmedia/express/blob/master/lib/application.js#L531

james_womack
quelle
6

Mit der neuesten Datei node.js (v0.3.8-pre): Ich habe die Dokumentation überprüft, die von http.createServer () zurückgegebene Serverinstanz überprüft und den Quellcode von server.listen () gelesen ...

Leider wird der Port nur vorübergehend als lokale Variable gespeichert und endet als Argument in einem Aufruf von process.binding ('net'). Bind (), einer nativen Methode. Ich habe nicht weiter gesucht.

Es scheint keinen besseren Weg zu geben, als einen Verweis auf den Portwert zu behalten, den Sie server.listen () zur Verfügung gestellt haben.

Eric Bréchemier
quelle
1
+1 und danke für die Recherche. Ich akzeptiere Alfreds Antwort, da er genau das gefunden hat, wonach ich gesucht habe, aber ich bin froh, dass ich weiß, dass es jetzt nicht im Knotenkern ist.
David Tang
5

Der einfachste Weg, vom alten Stil in den neuen (Express 3.x) Stil zu konvertieren, ist folgender:

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

Vor 3.x funktioniert es so:

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

Ich habe mir auch diese Frage gestellt, dann bin ich zur Express 4.x-Leitfadenseite gekommen , um dieses Beispiel zu sehen:

var server = app.listen(3000, function() {
   console.log('Listening on port %d', server.address().port);
});
Tien Do.
quelle
2
Ich weiß jedoch nicht, warum server.address (). Address auf meinem lokalen Entwicklungscomputer (OSX) immer 0.0.0.0 ist.
Tien Do
Dies sollte zur akzeptierten Antwort hinzugefügt werden, da Express 4.0 app.listen () nicht mehr als synchronen Vorgang behandelt und Sie listener.address () jetzt im Rückruf ausführen müssen.
RavenHursT
3

Sie können die Portnummer erhalten, indem Sie den server.address().port folgenden Code verwenden:

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

Express-Server überwacht Port 8881

KARTHIKEYAN.A
quelle
2

Wenn Sie die Portnummer nicht definiert haben und wissen möchten, auf welchem ​​Port sie ausgeführt wird.

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

Zu Ihrer Information, jedes Mal, wenn es in einem anderen Port ausgeführt wird.

Scheich
quelle
-1

unten ein einfacher http-Server und wie man den Listening-Port bekommt

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

Holen Sie sich dann den Server-Port mit:

console.log('Express server started on port %s', server.address().port);
Badr Bellaj
quelle
-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
quelle
-2

Der einfachere Weg ist, einfach anzurufen app.get('url'), wodurch Sie das Protokoll, die Subdomäne, die Domäne und den Port erhalten.

Downhillski
quelle