NodeJS: Como obter a porta do servidor?

142

Você costuma ver um exemplo de código hello world para o Node que cria um servidor HTTP, começa a escutar em uma porta e é seguido por algo como:

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

Mas o ideal é que você queira isso:

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

Como recupero a porta em que o servidor está ouvindo no momento sem armazenar o número em uma variável antes de ligar server.listen()?

Já vi isso antes, mas não consigo encontrá-lo na documentação do Nó. Talvez seja algo específico para expressar?

David Tang
fonte
3
Encontre emreq.headers.host
Andrew_1510

Respostas:

161

Resposta expressa 4.x:

O Express 4.x (conforme a resposta de Tien Do abaixo), agora trata app.listen () como uma operação assíncrona, portanto listener.address () retornará apenas dados dentro do retorno de chamada 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
});

Express 3 resposta:

Eu acho que você está procurando isso (express específico?):

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

Você pode ter visto isso (linha inferior), ao criar a estrutura de diretórios a partir do 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)
}
Alfred
fonte
1
Obrigado, acho que é exatamente isso que estou procurando. Aceito assim que tiver a chance de testá-lo. Felicidades.
David Tang
4
E se você não quiser ter essa variável var listenervocê pode usar this.address().portdentro de app.listen()callback
Andrei stalbe
Como é isso no Express 5.x?
Diogenes
2
Você também pode obter a qualquer lugar porto de um middleware: req.socket.address () porta.
jlguenego
Apenas para adicionar o que o @AndreiStalbe disse, você pode usar, this.address.port()mas não pode usá-lo dentro de uma função de seta. você vai precisar fazer a velha escola app.listen(8000, function () { console.log('http://localhost:' + this.address().port); }(sim, eu sei backticks são mais agradáveis, mas não posso fazê-las nos comentários de estouro de pilha)
WORMSS
65

No express v3.0,

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

não funciona mais! Para o Express v3.0, você deve criar um aplicativo e um servidor da seguinte maneira:

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

Eu mesmo corri para esse problema e queria documentar a nova sintaxe. Esta e outras alterações no Express v3.0 são visíveis em https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x

dgh
fonte
Ou você pode simplesmente usar o método antigo de criar o servidor, que ainda funciona. Parece que não existe mais uma maneira de acessar o posfácio da porta. No entanto, como você mesmo está especificando a porta na chamada para server.listen, realmente não há necessidade de usar server.address (). Port, pois você pode usar o mesmo valor que passou para server.listen.
Mary Hamlin
(Embora eu tinha acabado de ler o guia de migração e ver que o método para criar um aplicativo e servidor que você mencionou acima é na verdade o novo método preferido.)
Mary Hamlin
3
@MaryHamlin: Isto é útil se você estiver passando 0para server.listen(), caso em que um número de porta aleatório é atribuído. Você pode fazer isso se estiver executando vários aplicativos Express em um servidor e não desejar atribuir números de porta manualmente.
Nate
app.listen()também retorna a instância do servidor http.
Vicary
23

Na versão atual (v0.5.0-pre), a porta parece estar disponível como uma propriedade no objeto do 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);

saídas

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

Caso você precise de uma porta no momento do tratamento da solicitação e o aplicativo não esteja disponível, você pode usar o seguinte:

request.socket.localPort
user3348991
fonte
17

Se você estiver usando express, poderá obtê-lo no objeto request:

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

Eu uso dessa maneira o Express 4:

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

Ao usar isso, não preciso usar uma variável separada para o ouvinte / servidor.

Christian Landgren
fonte
1
Melhor resposta até agora! Se você estiver usando o ES6, não use as funções de seta. thisserá indefinido.
precisa saber é o seguinte
9

Exigir o módulo http nunca foi necessário.

Uma importação adicional de httpnão é necessária no Express 3 ou 4. A atribuição do resultado de listen()é 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

Novamente, isso é testado no Express 3.5.1 e 4.0.0. A importação httpnunca foi necessária. O método listen retorna um objeto de servidor http. https://github.com/visionmedia/express/blob/master/lib/application.js#L531

james_womack
fonte
6

Com o node.js mais recente (v0.3.8-pre): verifiquei a documentação, inspecionei a instância do servidor retornada por http.createServer () e li o código-fonte server.listen () ...

Infelizmente, a porta é armazenada apenas temporariamente como uma variável local e acaba como argumento em uma chamada para process.binding ('net'). Bind (), que é um método nativo. Eu não procurei mais.

Parece que não há maneira melhor do que manter uma referência ao valor da porta que você forneceu ao server.listen ().

Eric Bréchemier
fonte
1
+1 e obrigado pela pesquisa. Estou aceitando a resposta de Alfred desde que ele encontrou a coisa exata que eu estava procurando, mas estou feliz por saber que não está no núcleo do Node agora.
David Tang
5

A maneira mais simples de converter do estilo antigo para o novo (Express 3.x) é assim:

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

Antes da versão 3.x, funciona assim:

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

Eu também estava me fazendo essa pergunta, então vim para a página do guia Express 4.x para ver este exemplo:

var server = app.listen(3000, function() {
   console.log('Listening on port %d', server.address().port);
});
Tien Do
fonte
2
Mas não sei por que o endereço server.address (). É sempre 0.0.0.0 na minha máquina de desenvolvimento local (OSX).
Tien Do
Isso deve ser adicionado à resposta aceita, já que o Express 4.0 não trata mais app.listen () como uma operação síncrona e você precisa executar listener.address () no retorno de chamada agora.
Ravenhurst
3

Você pode obter o número da porta usando o server.address().port código abaixo:

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
fonte
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 escutando na porta 8881

KARTHIKEYAN.A
fonte
2

Se você não definiu o número da porta e deseja saber em qual porta está executando.

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

Para sua informação, sempre que ele for executado em uma porta diferente.

Xeque
fonte
-1

abaixo de um servidor http simples e como obter a porta de escuta

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

obtenha a porta do servidor usando:

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

A maneira mais fácil é ligar app.get('url'), o que fornece o protocolo, subdomínio, domínio e porta.

Downhillski
fonte