web-dev-qa-db-fra.com

NodeJS: Comment obtenir le port du serveur?

Vous voyez souvent un exemple de code hello world pour Node qui crée un serveur Http, commence à écouter sur un port, suivi d'un élément du type:

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 écoute actuellement sans stocker le numéro dans une variable avant d'appeler server.listen()?

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

121
David Tang

Réponse Express 4.x:

Express 4.x (selon la réponse de Tien Do ci-dessous) traite maintenant app.listen () comme une opération asynchrone. Par conséquent, listener.address () ne renverra des données que dans le 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 cela (ligne du bas) lorsque vous créez une structure de répertoire à partir de la commande express:

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)
}
142
Alfred

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 manière:

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 moi-même rencontré ce problème et je voulais documenter la nouvelle syntaxe. Cette modification, ainsi que d’autres modifications apportées à Express v3.0, sont visibles sur le site https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x

64
dgh

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#). adresse.serveur

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
22
Jörn Horstmann

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.
17
chovy

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

request.socket.localPort
16
user3348991

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'écouteur/serveur.

14
Christian Landgren

Requérir le module http n’a jamais été nécessaire.

Une importation supplémentaire de http n'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 & 4.0.0. Importer 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

9
james_womack

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

Malheureusement, le port est uniquement stocké temporairement en tant que variable locale et finit en tant qu'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 ().

6
Eric Bréchemier

Le moyen le plus simple de convertir l'ancien style en 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);
5
Waylon Flinn
req.headers.Host.split(':')[1]
4
RockerFlower

Je me posais aussi cette question, puis je suis venu 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);
});
3
Tien Do

Vous pouvez obtenir le numéro de port en utilisant server.address().port comme 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);
});
3
Shubham Verma
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

3
KARTHIKEYAN.A

Si vous n'avez pas défini le numéro de port et que vous voulez savoir sur quel port il est exécuté.

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

Pour info, à chaque fois, il fonctionnera dans un port différent.

0
Sheik

La findandbind npm résout ce problème pour express/restify/connect: https://github.com/gyllstromk/node-find-and-bind

0
muckabout