NodeJS: Wie erhalte ich den Port des Servers?

Lesezeit: 6 Minuten

Benutzer-Avatar
David Tang

Sie sehen oft Beispiel-Hello-World-Code für Node, der einen Http-Server erstellt, beginnt, einen Port zu überwachen, gefolgt von etwas in der Art von:

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

Aber idealerweise 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 Anruf in einer Variablen zu speichern? server.listen()?

Ich habe das schon einmal gesehen, aber ich kann es nicht in der Node-Dokumentation finden. Vielleicht ist es etwas bestimmtes auszudrücken?

  • Zu finden in req.headers.host

    – Andreas_1510

    9. Januar 2016 um 13:14 Uhr

Benutzer-Avatar
Alfred

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 Callbacks 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 das (ausdrücklich spezifisch?):

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

Möglicherweise haben Sie dies (unterm Strich) gesehen, als Sie eine Verzeichnisstruktur erstellt haben express Befehl:

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("https://stackoverflow.com/", 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)
}

  • Danke, ich glaube das ist genau das was ich suche. Ich werde es akzeptieren, sobald ich die Möglichkeit habe, es zu testen. Prost.

    – David Tang

    30. Januar 2011 um 20:54 Uhr

  • Und wenn Sie diese Variable nicht haben möchten var listener Sie können verwenden this.address().port Innerhalb app.listen() zurückrufen

    – Andrej Stalbe

    23. Januar 2016 um 9:19 Uhr

  • Wie sieht das in Express 5.x aus?

    – Diogenes

    9. Juli 2017 um 18:20 Uhr

  • Sie können den Port auch überall in einer Middleware abrufen: req.socket.address().port

    – jlguenego

    30. April 2018 um 11:33 Uhr

  • Nur um das zu ergänzen, was @AndreiStalbe gesagt hat, können Sie verwenden this.address.port() aber Sie können das nicht innerhalb einer Pfeilfunktion verwenden. Sie müssen die alte Schule 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 Stapelüberlaufkommentaren verwenden.)

    – WORMSS

    26. April 2019 um 9:19 Uhr

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 auf diese Weise eine App und einen Server erstellen:

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

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

app.get("https://stackoverflow.com/", 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 sichtbar unter https://github.com/visionmedia/express/wiki/Migration-from-2.x-to-3.x

  • Oder Sie könnten einfach die alte Methode zum Erstellen des Servers verwenden, die immer noch funktioniert. Es scheint einfach keine Möglichkeit mehr zu geben, nachträglich auf den Port zuzugreifen. Da Sie den Port jedoch selbst im Aufruf von server.listen angeben, besteht wirklich keine Notwendigkeit, server.address().port zu verwenden, da Sie einfach denselben Wert verwenden können, den Sie an server.listen übergeben haben.

    – Mary Hamlin

    31. Juli 2012 um 16:49 Uhr

  • (Obwohl ich gerade den Migrationsleitfaden gelesen und gesehen habe, dass die Methode zum Erstellen einer App und eines Servers, die Sie oben erwähnt haben, tatsächlich die neue bevorzugte Methode ist.)

    – Mary Hamlin

    31. Juli 2012 um 20:43 Uhr

  • @MaryHamlin: Dies ist nützlich, wenn Sie vorbeikommen 0 zu 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 Portnummern nicht manuell zuweisen möchten.

    – Nate

    31. August 2012 um 7:28 Uhr

  • app.listen() gibt auch die HTTP-Serverinstanz zurück.

    – Pfarrhaus

    5. Januar 2014 um 9:51 Uhr

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

request.socket.localPort

  • Dies ist die Antwort! 🙂

    – KARASZI Istvan

    3. März um 10:24 Uhr

In der aktuellen Version (v0.5.0-pre) scheint der Port als Eigenschaft auf dem 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

Ich verwende auf diese Weise Express 4:

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

Dadurch muss ich keine separate Variable für den Listener/Server verwenden.

  • Beste Antwort bisher! Wenn Sie ES6 verwenden, verwenden Sie keine Pfeilfunktionen. this wird undefiniert sein.

    – Laxmana

    21. Juli 2017 um 10:19 Uhr


  • Dies funktioniert von innen an async Funktion während listener.address().port Ansatz nicht.

    – Ciro Santilli Путлер Капут 六四事

    24. Dezember 2021 um 9:07 Uhr

Benutzer-Avatar
Chovy

Wenn Sie Express verwenden, können Sie es aus dem Anfrageobjekt abrufen:

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

  • Beste Antwort bisher! Wenn Sie ES6 verwenden, verwenden Sie keine Pfeilfunktionen. this wird undefiniert sein.

    – Laxmana

    21. Juli 2017 um 10:19 Uhr


  • Dies funktioniert von innen an async Funktion während listener.address().port Ansatz nicht.

    – Ciro Santilli Путлер Капут 六四事

    24. Dezember 2021 um 9:07 Uhr

Das Erfordernis des http-Moduls war nie notwendig.

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

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

server.get("https://stackoverflow.com/", 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

Auch dies wird in Express 3.5.1 & 4.0.0 getestet. Importieren http war nie nötig. Die Listen-Methode gibt ein HTTP-Serverobjekt zurück.
https://github.com/visionmedia/express/blob/master/lib/application.js#L531

1281450cookie-checkNodeJS: Wie erhalte ich den Port des Servers?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy