NodeJS: Comment obtenir le port du serveur?

143

Vous voyez souvent un exemple de code hello world pour Node qui crée un serveur Http, commence à écouter sur un port, puis suivi par quelque chose du genre:

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

Mais idéalement, vous voudriez plutôt ceci:

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

Comment récupérer le port sur lequel le serveur écoute actuellement sans stocker le numéro dans une variable avant d'appeler server.listen()?

J'ai déjà vu cela faire mais je ne le trouve pas dans la documentation Node. Peut-être que c'est quelque chose de spécifique à exprimer?

David Tang
la source
3
Trouver dansreq.headers.host
Andrew_1510

Réponses:

162

Réponse express 4.x:

Express 4.x (selon la réponse de Tien Do ci-dessous), traite désormais app.listen () comme une opération asynchrone, donc listener.address () ne retournera que les données à l'intérieur du rappel de app.listen ():

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

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

Réponse Express 3:

Je pense que vous recherchez ceci (express spécifique?):

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

Vous avez peut-être vu ceci (ligne du bas), lorsque vous créez une structure de répertoire à partir de la expresscommande:

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
la source
1
Merci, je pense que c'est exactement ce que je recherche. Je l'accepterai dès que j'aurai l'occasion de le tester. À votre santé.
David Tang
4
Et si vous ne voulez pas avoir cette variable, var listenervous pouvez utiliser le rappel this.address().portinterneapp.listen()
Andrei Stalbe
À quoi cela ressemble-t-il dans Express 5.x?
Diogenes
2
Vous pouvez également obtenir le port n'importe où dans un middleware: req.socket.address (). Port
jlguenego
Juste pour ajouter à ce que @AndreiStalbe a dit, vous pouvez utiliser this.address.port()mais vous ne pouvez pas l'utiliser dans une fonction de flèche. vous devrez faire de la vieille école app.listen(8000, function () { console.log('http://localhost:' + this.address().port); }(oui, je sais que les backticks sont plus gentils, mais je ne peux pas les faire dans les commentaires de débordement de pile)
WORMSS
66

Dans express v3.0,

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

ne fonctionne plus! Pour Express v3.0, vous devez créer une application et un serveur de cette façon:

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

J'ai couru moi-même sur ce problème et je voulais documenter la nouvelle syntaxe. Ceci et d'autres changements dans Express v3.0 sont visibles à https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x

dgh
la source
Ou vous pouvez simplement utiliser l'ancienne méthode de création du serveur, qui fonctionne toujours. Il ne semble plus y avoir de moyen d'accéder à la postface du port. Cependant, puisque vous spécifiez le port vous-même dans l'appel à server.listen, il n'est vraiment pas nécessaire d'utiliser server.address (). Port, puisque vous pouvez simplement utiliser la même valeur que celle que vous avez passée à server.listen.
Mary Hamlin
(Bien que je viens de lire le guide de migration et de voir que la méthode de création d'une application et d'un serveur que vous avez mentionnés ci-dessus est en fait la nouvelle méthode préférée.)
Mary Hamlin
3
@MaryHamlin: Ceci est utile si vous passez 0à server.listen(), auquel cas un numéro de port aléatoire est attribué. Vous pouvez le faire si vous exécutez plusieurs applications Express sur un serveur et que vous ne souhaitez pas attribuer manuellement des numéros de port.
Nate
app.listen()renvoie également l'instance de serveur http.
Vicary
23

Dans la version actuelle (v0.5.0-pre), le port semble être disponible en tant que propriété sur l'objet serveur, voir 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);

les sorties

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

Si vous avez besoin d'un port au moment du traitement de la demande et que l'application n'est pas disponible, vous pouvez utiliser ceci:

request.socket.localPort
user3348991
la source
17

Si vous utilisez express, vous pouvez l'obtenir à partir de l'objet request:

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

J'utilise de cette façon Express 4:

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

En utilisant cela, je n'ai pas besoin d'utiliser une variable distincte pour l'auditeur / serveur.

Christian Landgren
la source
1
Meilleure réponse à ce jour! Si vous utilisez ES6, n'utilisez pas les fonctions fléchées. thissera indéfini.
Laxmana
9

Il n'a jamais été nécessaire d'exiger le module http.

Une importation supplémentaire de httpn'est pas nécessaire dans Express 3 ou 4. L'affectation du résultat de listen()suffit.

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

Encore une fois, cela est testé dans Express 3.5.1 et 4.0.0. L'importation httpn'a jamais été nécessaire. La méthode listen renvoie un objet serveur http. https://github.com/visionmedia/express/blob/master/lib/application.js#L531

james_womack
la source
6

Avec le dernier node.js (v0.3.8-pre): j'ai vérifié la documentation, inspecté l'instance de serveur renvoyée par http.createServer (), et lu le code source de server.listen () ...

Malheureusement, le port n'est stocké que temporairement en tant que variable locale et se termine en argument dans un appel à process.binding ('net'). Bind () qui est une méthode native. Je n'ai pas cherché plus loin.

Il semble qu'il n'y ait pas de meilleur moyen que de conserver une référence à la valeur de port que vous avez fournie à server.listen ().

Eric Bréchemier
la source
1
+1 et merci pour la recherche. J'accepte la réponse d'Alfred car il a trouvé exactement ce que je cherchais, mais je suis content de savoir que ce n'est pas dans le noyau de Node maintenant.
David Tang
5

Le moyen le plus simple de convertir l'ancien style au nouveau style (Express 3.x) est le suivant:

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

Pre 3.x cela fonctionne comme ceci:

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

Je me posais aussi cette question, puis je suis venu à la page du guide Express 4.x pour voir cet exemple:

var server = app.listen(3000, function() {
   console.log('Listening on port %d', server.address().port);
});
Tien Do
la source
2
Mais je ne sais pas pourquoi server.address (). Address est toujours 0.0.0.0 sur ma machine de développement locale (OSX).
Tien Do
Cela devrait être ajouté à la réponse acceptée car Express 4.0 ne traite plus app.listen () comme une opération synchrone et vous devez maintenant exécuter listener.address () dans le rappel.
RavenHursT
3

Vous pouvez obtenir le numéro de port en utilisant server.address().port comme dans le code ci-dessous:

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

Serveur express à l'écoute sur le port 8881

KARTHIKEYAN.A
la source
2

Si vous n'avez pas défini le numéro de port et que vous souhaitez savoir sur quel port il s'exécute.

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

FYI, chaque fois qu'il fonctionnera dans un port différent.

Cheik
la source
-1

ci-dessous un simple serveur http et comment obtenir le port d'écoute

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

puis récupérez le port du serveur en utilisant:

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

Le moyen le plus simple est simplement d'appeler app.get('url'), ce qui vous donne le protocole, le sous-domaine, le domaine et le port.

Ski alpin
la source