NodeJS: Как получить порт сервера? - PullRequest
118 голосов
/ 30 января 2011

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

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

Но в идеале вы бы хотели этого:

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

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

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

Ответы [ 18 ]

139 голосов
/ 30 января 2011

Экспресс 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)
}
64 голосов
/ 19 июля 2012

In express 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

22 голосов
/ 12 мая 2011

В текущей версии (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
17 голосов
/ 21 октября 2012

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

req.app.settings.port // => 8080 or whatever your app is listening at.
16 голосов
/ 25 февраля 2014

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

request.socket.localPort
13 голосов
/ 16 марта 2015

Я использую этот способ Express 4:

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

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

9 голосов
/ 15 апреля 2014

Требование 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 никогда не был необходим.Метод listen возвращает объект http-сервера.https://github.com/visionmedia/express/blob/master/lib/application.js#L531

6 голосов
/ 30 января 2011

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

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

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

5 голосов
/ 12 марта 2014

Простейший способ конвертировать старый стиль в новый (Express 3.x):

4 голосов
/ 22 июня 2016
req.headers.host.split(':')[1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...