173 votes

NodeJS : Comment obtenir le port du serveur ?

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

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

Mais idéalement, vous voudriez ceci à la place :

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

Comment récupérer le port sur lequel le serveur est actuellement en train d'écouter sans stocker le numéro dans une variable avant l'appel ? server.listen() ?

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

3 votes

Trouver dans req.headers.host

195voto

Alfred Points 32190

Réponse d'Express 4.x :

Express 4.x (selon la réponse de Tien Do ci-dessous), traite maintenant app.listen() comme une opération asynchrone, donc listener.address() ne retournera des données qu'à l'intérieur du callback 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
});

Exprimez 3 réponses :

Je pense que c'est ce que vous recherchez (spécifique à l'express ?) :

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

Vous avez peut-être vu ceci (ligne de fond), lorsque vous créez une structure de répertoire à partir de express commandement :

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 votes

Merci, je pense que c'est exactement ce que je cherche. Je l'accepterai dès que j'aurai l'occasion de le tester. Merci.

8 votes

Et si vous ne voulez pas avoir cette variable var listener vous pouvez utiliser this.address().port à l'intérieur de app.listen() rappel

1 votes

Comment cela se présente-t-il dans Express 5.x ?

68voto

dghubble Points 2893

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 rencontré ce problème moi-même et j'ai voulu documenter la nouvelle syntaxe. Cette modification et d'autres changements dans Express v3.0 sont visibles à l'adresse suivante https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x

0 votes

Ou vous pouvez simplement utiliser l'ancienne méthode de création du serveur, qui fonctionne toujours. Il semble simplement qu'il n'y ait plus de moyen d'accéder au port par la suite. Cependant, puisque vous spécifiez vous-même le port dans l'appel à server.listen, il n'est pas vraiment nécessaire d'utiliser server.address().port, puisque vous pouvez simplement utiliser la même valeur que celle passée à server.listen.

0 votes

(Bien que je vienne 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ée ci-dessus est en fait la nouvelle méthode préférée).

3 votes

@MaryHamlin : Ceci est utile si vous passez 0 a server.listen() Dans ce cas, un numéro de port aléatoire est attribué. Vous pouvez procéder ainsi si vous exécutez plusieurs applications Express sur un serveur et que vous ne souhaitez pas attribuer manuellement des numéros de port.

27voto

Jörn Horstmann Points 18118

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

sorties

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

17voto

chovy Points 8012

Si vous utilisez express, vous pouvez l'obtenir à partir de l'objet de requête :

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

11voto

james_womack Points 4359

Exiger le module http n'a jamais été nécessaire.

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

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, ceci est testé dans Express 3.5.1 & 4.0.0. Importation http n'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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X