NodeJS: ¿Cómo obtener el puerto del servidor?

142

A menudo ve un ejemplo de código hello world para Node que crea un servidor Http, comienza a escuchar en un puerto y luego sigue algo como:

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

Pero idealmente querrías esto en su lugar:

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

¿Cómo recupero el puerto que el servidor está escuchando actualmente sin almacenar el número en una variable antes de llamar server.listen()?

He visto esto antes, pero no puedo encontrarlo en la documentación del Nodo. Tal vez es algo específico para expresar?

David Tang
fuente
3
Buscar enreq.headers.host
Andrew_1510

Respuestas:

161

Exprese la respuesta 4.x:

Express 4.x (según la respuesta de Tien Do a continuación), ahora trata app.listen () como una operación asincrónica, por lo que listener.address () solo devolverá datos dentro de la devolución de llamada 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
});

Expresa 3 respuestas:

Creo que estás buscando esto (¿expreso específico?):

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

Es posible que haya visto esto (línea inferior), cuando crea la estructura de directorios desde el expresscomando:

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)
}
Alfredo
fuente
1
Gracias, creo que eso es exactamente lo que estoy buscando. Lo aceptaré tan pronto como tenga la oportunidad de probarlo. Salud.
David Tang
44
Y si no desea tener esa variable var listener, puede usar la devolución de llamada this.address().portinternaapp.listen()
Andrei Stalbe el
¿Cómo se ve esto en Express 5.x?
Diógenes
2
También puede obtener el puerto en cualquier lugar de un middleware: req.socket.address (). Port
jlguenego
Solo para agregar a lo que dijo @AndreiStalbe, puede usar this.address.port()pero no puede usar eso dentro de una función de flecha. tendrá que hacer la vieja escuela app.listen(8000, function () { console.log('http://localhost:' + this.address().port); }(sí, ya sé acentos abiertos son más agradables, pero no puede hacerlo en los comentarios de desbordamiento de pila)
WORMSS
65

En express v3.0,

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

ya no funciona! Para Express v3.0, debe crear una aplicación y un servidor de esta manera:

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

Me encontré con este problema yo mismo y quería documentar la nueva sintaxis. Este y otros cambios en Express v3.0 están visibles en https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x

dgh
fuente
O bien, puede usar el método anterior para crear el servidor, que aún funciona. Parece que ya no hay una manera de acceder al puerto después de la palabra. Sin embargo, dado que está especificando el puerto usted mismo en la llamada a server.listen, realmente no es necesario usar server.address (). Port, ya que puede usar el mismo valor que pasó a server.listen.
Mary Hamlin
(Aunque acabo de leer la guía de migración y veo que el método para crear una aplicación y un servidor que mencionó anteriormente es en realidad el nuevo método preferido)
Mary Hamlin
3
@MaryHamlin: Esto es útil si está pasando 0a server.listen(), en cuyo caso se asigna un número de puerto aleatorio. Puede hacer esto si está ejecutando varias aplicaciones Express en un servidor y no desea asignar números de puerto manualmente.
Nate
app.listen()también devuelve la instancia del servidor http.
Vicario
23

En la versión actual (v0.5.0-pre), el puerto parece estar disponible como una propiedad en el objeto del servidor, consulte 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);

salidas

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

En caso de que necesite un puerto en el momento del manejo de la solicitud y la aplicación no esté disponible, puede usar esto:

request.socket.localPort
user3348991
fuente
17

Si está utilizando express, puede obtenerlo del objeto de solicitud:

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

Yo uso de esta manera Express 4:

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

Al usar esto, no necesito usar una variable separada para el oyente / servidor.

Christian Landgren
fuente
1
¡La mejor respuesta hasta ahora! Si está utilizando ES6, no use las funciones de flecha. thisserá indefinido
Laxmana
9

Requerir el módulo http nunca fue necesario.

No httpes necesaria una importación adicional de Express 3 o 4. Asignar el resultado de listen()es suficiente.

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

Nuevamente, esto se prueba en Express 3.5.1 y 4.0.0. Importar httpnunca fue necesario. El método listen devuelve un objeto de servidor http. https://github.com/visionmedia/express/blob/master/lib/application.js#L531

james_womack
fuente
6

Con el último node.js (v0.3.8-pre): verifiqué la documentación, inspeccioné la instancia del servidor devuelta por http.createServer () y leí el código fuente de server.listen () ...

Lamentablemente, el puerto solo se almacena temporalmente como una variable local y termina como un argumento en una llamada a process.binding ('net'). Bind (), que es un método nativo. No busqué más.

Parece que no hay mejor manera que mantener una referencia al valor del puerto que proporcionó a server.listen ().

Eric Bréchemier
fuente
1
+1 y gracias por la investigación. Estoy aceptando la respuesta de Alfred ya que encontró exactamente lo que estaba buscando, pero me alegra saber que no está en el núcleo del Nodo ahora.
David Tang
5

La forma más sencilla de convertir del estilo antiguo al nuevo (Express 3.x) es así:

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

Pre 3.x funciona así:

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

También me hacía esta pregunta, luego llegué a la página de guía Express 4.x para ver esta muestra:

var server = app.listen(3000, function() {
   console.log('Listening on port %d', server.address().port);
});
Tien Do
fuente
2
Pero no sé por qué la dirección server.address (). Siempre es 0.0.0.0 en mi máquina de desarrollo local (OSX).
Tien Do
Esto debe agregarse a la respuesta aceptada, ya que Express 4.0 ya no trata app.listen () como una operación síncrona y ahora debe ejecutar listener.address () en la devolución de llamada.
RavenHursT
3

Puede obtener el número de puerto utilizando el server.address().port código siguiente:

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

Servidor Express escuchando en el puerto 8881

KARTHIKEYAN.A
fuente
2

Si no definió el número de puerto y desea saber en qué puerto se está ejecutando.

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

Para su información, cada vez se ejecutará en un puerto diferente.

Jeque
fuente
-1

debajo de un servidor http simple y cómo obtener el puerto de escucha

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

luego obtenga el puerto del servidor usando:

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

La forma más fácil es simplemente llamar app.get('url'), lo que le proporciona el protocolo, subdominio, dominio y puerto.

Downhillski
fuente