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?
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)
}
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
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
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.
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
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.
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
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 ().
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);
req.headers.Host.split(':')[1]
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);
});
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);
});
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
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.
La findandbind
npm résout ce problème pour express/restify/connect: https://github.com/gyllstromk/node-find-and-bind