NodeJS: Як отримати порт сервера?


142

Ви часто бачите приклад привіт світовий код для Node, який створює Http-сервер, починає прослуховувати порт, а потім щось слідує за рядками:

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

Але в ідеалі ви цього хочете:

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

Як отримати порт, який сервер зараз слухає, не зберігаючи номер у змінній перед викликом server.listen()?

Я бачив це вже раніше, але не можу знайти його в документації на Вузол. Може це виразити щось конкретне?


3
Знайдітьreq.headers.host
Андрій_1510

Відповіді:


161

Експрес 4.x відповідь:

Експрес 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?
Діоген

2
Також ви можете отримати порт в будь-якому місці середнього програмного забезпечення: req.socket.address (). Port
jlguenego

Просто для додання того, що сказав @AndreiStalbe, ви можете використовувати, this.address.port()але ви не можете використовувати це всередині функції стрілки. вам знадобиться робити стару школу app.listen(8000, function () { console.log('http://localhost:' + this.address().port); }(так, я знаю, що зворотні посилання є кращими, але я не можу їх робити в коментарях із переповненням стеків)
ВІДПОВІСТИ

65

У 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


Або ви могли просто використовувати старий метод створення сервера, який все ще працює. Здається, більше немає способу отримати доступ до порту після слова. Однак, оскільки ви самі вказуєте порт під час виклику server.listen, насправді не потрібно використовувати порт server.address ()., Оскільки ви можете просто використовувати те саме значення, яке ви передали в server.listen.
Мері Гамлін

(Хоча я щойно прочитав посібник з міграції та побачив, що метод створення програми та сервера, який ви згадали вище, насправді є новим кращим методом.)
Мері Хамлін,

3
@MaryHamlin: Це корисно, якщо ви переходите 0до цього server.listen(), у цьому випадку присвоюється випадковий номер порту. Це можна зробити, якщо на одному сервері запущено кілька програм Express, і ви не хочете вручну призначати номери портів.
Нейт

app.listen()також повертає екземпляр сервера http.
Вікарій

23

У поточній версії (v0.5.0-попередньо) порт, здається, доступний як властивість об’єкта сервера, див. 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.

14

Я використовую цей спосіб Express 4:

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

Використовуючи це, мені не потрібно використовувати окрему змінну для слухача / сервера.


1
Найкраща відповідь поки! Якщо ви використовуєте ES6, не використовуйте стрілочні функції. thisбуде невизначено
Лаксмана

9

Потрібен модуль http ніколи не був необхідним.

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

Pre 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).
Тянь-ду

Це слід додати до прийнятої відповіді, оскільки 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.