NodeJS: Как получить порт сервера?

Вы часто видите пример кода hello world для Node, который создает Http-сервер, начинает прослушивание порта, а затем следует что-то вроде:

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

Но в идеале вам нужно вместо этого:

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

Как мне получить порт, который сервер в настоящее время прослушивает, не сохраняя номер в переменной перед вызовом server.listen()?

Я видел это раньше, но не могу найти его в документации по Node. Может это что-то конкретное выразить?


person David Tang    schedule 30.01.2011    source источник
comment
Найти в req.headers.host   -  person Andrew_1510    schedule 09.01.2016


Ответы (17)


Ответ Express 4.x:

Express 4.x (согласно ответу Tien Do ниже) теперь обрабатывает app.listen () как асинхронную операцию, поэтому listener.address () будет возвращать данные только внутри обратного вызова app.listen ():

var app = require('express')();

var listener = app.listen(8888, function(){
    console.log('Listening on port ' + listener.address().port); //Listening on port 8888
});

Экспресс-ответ 3:

Я думаю, вы ищете это (выразите конкретное?):

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

Вы могли видеть это (нижняя строка), когда создавали структуру каталогов с помощью команды 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)
}
person Alfred    schedule 30.01.2011
comment
Спасибо, я думаю, это именно то, что я ищу. Я приму это, как только у меня будет возможность протестировать. Ваше здоровье. - person David Tang; 30.01.2011
comment
И если вы не хотите, чтобы эта переменная var listener, вы можете использовать this.address().port внутри app.listen() обратного вызова - person Andrei Stalbe; 23.01.2016
comment
Как это выглядит в Express 5.x? - person Diogenes; 09.07.2017
comment
Вы также можете получить порт в любом месте промежуточного программного обеспечения: req.socket.address (). Port - person jlguenego; 30.04.2018
comment
Просто чтобы добавить к тому, что сказал @AndreiStalbe, вы можете использовать this.address.port(), но вы не можете использовать это внутри функции стрелки. вам нужно будет использовать старую школу app.listen(8000, function () { console.log('http://localhost:' + this.address().port); } (да, я знаю, что обратные кавычки лучше, но я не могу использовать их в комментариях к переполнению стека) - person WORMSS; 26.04.2019

В экспресс v3.0,

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

больше не работает! Для Express v3.0 вы должны создать приложение и сервер следующим образом:

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

Я сам столкнулся с этой проблемой и хотел задокументировать новый синтаксис. Это и другие изменения в Express v3.0 можно увидеть по адресу https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x

person dgh    schedule 19.07.2012
comment
Или вы можете просто использовать старый метод создания сервера, который все еще работает. Просто, похоже, больше нет возможности получить доступ к послесловию порта. Однако, поскольку вы сами указываете порт при вызове server.listen, на самом деле нет необходимости использовать server.address (). Port, поскольку вы можете просто использовать то же значение, которое вы передали в server.listen. - person Mary Hamlin; 31.07.2012
comment
(Хотя я только что прочитал руководство по миграции и увидел, что метод создания приложения и сервера, о котором вы упомянули выше, на самом деле является новым предпочтительным методом.) - person Mary Hamlin; 01.08.2012
comment
@MaryHamlin: это полезно, если вы передаете 0 в server.listen(), и в этом случае назначается случайный номер порта. Это можно сделать, если вы запускаете несколько приложений Express на одном сервере и не хотите вручную назначать номера портов. - person Nate; 31.08.2012
comment
app.listen() также возвращает экземпляр http-сервера. - person Vicary; 05.01.2014

В текущей версии (v0.5.0-pre) порт, похоже, доступен как свойство объекта сервера, см. 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);

выходы

{ address: '0.0.0.0', port: 8088 }
0.0.0.0
8088
person Jörn Horstmann    schedule 12.05.2011

В случае, если вам нужен порт во время обработки запроса, а приложение недоступно, вы можете использовать это:

request.socket.localPort
person user3348991    schedule 25.02.2014

Если вы используете экспресс, вы можете получить его из объекта запроса:

req.app.settings.port // => 8080 or whatever your app is listening at.
person chovy    schedule 21.10.2012

Я использую такой способ Express 4:

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

Используя это, мне не нужно использовать отдельную переменную для слушателя / сервера.

person Christian Landgren    schedule 16.03.2015
comment
Лучший ответ на данный момент! Если вы используете ES6, не используйте стрелочные функции. this будет неопределенным. - person Laxmana; 21.07.2017

Требовать модуль http никогда не было необходимости.

Дополнительный импорт http не требуется в Express 3 или 4. Достаточно присвоить результат listen().

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

Опять же, это проверено в Express 3.5.1 и 4.0.0. Импорт http никогда не требовался. Метод прослушивания возвращает объект HTTP-сервера. https://github.com/visionmedia/express/blob/master/lib/application.js#L531

person james_womack    schedule 15.04.2014

С последней версией node.js (v0.3.8-pre): я проверил документацию, проверил экземпляр сервера, возвращенный http.createServer (), и прочитал исходный код server.listen () ...

К сожалению, порт сохраняется только временно как локальная переменная и заканчивается как аргумент в вызове process.binding ('net'). Bind (), который является собственным методом. Я не смотрел дальше.

Кажется, что нет лучшего способа, чем сохранить ссылку на значение порта, которое вы указали для server.listen ().

person Eric Bréchemier    schedule 30.01.2011
comment
+1 и спасибо за исследования. Я принимаю ответ Альфреда, так как он нашел именно то, что я искал, но я рад, что знаю, что его сейчас нет в ядре Node. - person David Tang; 31.01.2011

Самый простой способ преобразовать старый стиль в новый (Express 3.x) выглядит так:

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

До 3.x это работает так:

/* This no longer works */
app.listen(8080);
console.log('Listening on port: ' + app.address().port);
person Waylon Flinn    schedule 12.03.2014

Я тоже задавал себе этот вопрос, затем я зашел на страницу руководства по Express 4.x, чтобы увидеть этот образец:

var server = app.listen(3000, function() {
   console.log('Listening on port %d', server.address().port);
});
person Tien Do    schedule 02.10.2014
comment
Но я не знаю, почему адрес server.address (). Всегда 0.0.0.0 на моей локальной машине разработки (OSX). - person Tien Do; 02.10.2014
comment
Это должно быть добавлено к принятому ответу, поскольку Express 4.0 больше не обрабатывает app.listen () как синхронную операцию, и теперь вам нужно запустить listener.address () в обратном вызове. - person RavenHursT; 13.08.2015

Вы можете получить номер порта, используя server.address().port, как в приведенном ниже коде:

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);
});
person Shubham Verma    schedule 04.04.2017

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

Экспресс-сервер прослушивает порт 8881

person KARTHIKEYAN.A    schedule 04.04.2017

Если вы не указали номер порта и хотите знать, на каком порту он работает.

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

К вашему сведению, каждый раз он будет запускаться в другом порту.

person Sheik    schedule 17.03.2019

findandbind npm решает эту проблему для экспресс / restify / connect: https://github.com/gyllstromk/node-find-and-bind

person muckabout    schedule 12.12.2013

Возможно, вы ищете process.env.PORT. Это позволяет вам динамически устанавливать порт прослушивания, используя так называемые переменные среды. Код Node.js будет выглядеть так:

const port = process.env.PORT || 3000; 
app.listen(port, () => {console.log(`Listening on port ${port}...`)}); 

Вы даже можете вручную установить динамическую переменную в терминале, используя export PORT=5000 или любой другой порт, который вам нужен.

person Kal Heyn    schedule 18.11.2020

ниже простой http-сервер и как получить порт прослушивания

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

затем получите порт сервера, используя:

console.log('Express server started on port %s', server.address().port);
person Badr Bellaj    schedule 14.09.2016

Более простой способ - просто вызвать app.get('url'), который даст вам протокол, поддомен, домен и порт.

person Downhillski    schedule 16.09.2016