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


148

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

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

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

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

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

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


3
Найти вreq.headers.host
Andrew_1510 09

Ответы:


166

Экспресс 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)
}

1
Спасибо, думаю, это именно то, что я ищу. Я приму это, как только у меня будет возможность протестировать. Ура.
Дэвид Тан

4
И если вы не хотите иметь эту переменную, var listenerвы можете использовать this.address().portвнутренний app.listen()обратный вызов
Андрей Штальбе

Как это выглядит в Express 5.x?
Diogenes

2
Вы также можете получить порт в любом месте промежуточного программного обеспечения: req.socket.address (). Port
jlguenego

Просто чтобы добавить к тому, что сказал @AndreiStalbe, вы можете использовать, this.address.port()но не можете использовать это внутри функции стрелки. вам нужно будет использовать старую школу app.listen(8000, function () { console.log('http://localhost:' + this.address().port); }(да, я знаю, что обратные кавычки лучше, но я не могу использовать их в комментариях к переполнению стека)
WORMSS

66

В экспресс 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.


Или вы можете просто использовать старый метод создания сервера, который все еще работает. Просто, похоже, больше нет способа получить доступ к послесловию порта. Однако, поскольку вы сами указываете порт при вызове server.listen, в действительности нет необходимости использовать server.address (). Port, поскольку вы можете просто использовать то же значение, которое вы передали в server.listen.
Мэри Хэмлин

(Хотя я только что прочитал руководство по миграции и увидел, что метод создания приложения и сервера, о котором вы упомянули выше, на самом деле является новым предпочтительным методом.)
Мэри Хэмлин

3
@MaryHamlin: это полезно, если вы переходите 0к server.listen(), и в этом случае назначается случайный номер порта. Вы можете сделать это, если вы запускаете несколько приложений Express на одном сервере и не хотите вручную назначать номера портов.
Нейт

app.listen()также возвращает экземпляр http-сервера.
Vicary

23

В текущей версии (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

22

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

request.socket.localPort

17

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

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

15

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

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

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


2
Лучший ответ на данный момент! Если вы используете ES6, не используйте стрелочные функции. thisбудет неопределенным.
Laxmana

9

В требовании модуля 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


6

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

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

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


1
+1 и спасибо за исследования. Я принимаю ответ Альфреда, так как он нашел именно то, что я искал, но я рад, что знаю, что его сейчас нет в ядре узла.
Дэвид Тан

5

Самый простой способ преобразовать старый стиль в новый (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);


3

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

var server = app.listen(3000, function() {
   console.log('Listening on port %d', server.address().port);
});

2
Но я не знаю, почему адрес server.address (). Всегда 0.0.0.0 на моей локальной машине разработки (OSX).
Tien Do

Это должно быть добавлено к принятому ответу, поскольку Express 4.0 больше не обрабатывает app.listen () как синхронную операцию, и теперь вам нужно запустить listener.address () в обратном вызове.
RavenHursT

3

Вы можете получить номер порта, используя 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);
});

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

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


2

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

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

FYI, каждый раз он будет работать в другом порту.



-1

ниже простой 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);

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

-2

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.