NodeJS: Как получить порт сервера?
Вы часто видите пример hello world code для Node, который создает Http-сервер, начинает прослушивать порт, а затем следует что-то по строкам:
console.log('Server is listening on port 8000');
Но в идеале вы бы хотели этого:
console.log('Server is listening on port ' + server.port);
Как получить порт, который в данный момент прослушивает сервер, не сохраняя номер в переменной до вызова server.listen()
?
Я видел это раньше, но не могу найти его в документации Node. Может быть, это что-то конкретное для выражения?
Ответы
Ответ 1
Ответ Express 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
:
[email protected]:~/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
[email protected]:~/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)
}
Ответ 2
В 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
Ответ 3
В текущей версии (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
Ответ 4
Если вы используете экспресс, вы можете получить его из объекта запроса:
req.app.settings.port // => 8080 or whatever your app is listening at.
Ответ 5
Если вам нужен порт во время обработки запроса и приложение недоступно, вы можете использовать это:
request.socket.localPort
Ответ 6
Требование, чтобы модуль 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
Ответ 7
Я использую этот способ Express 4:
app.listen(1337, function(){
console.log('Express listening on port', this.address().port);
});
Используя это, мне не нужно использовать отдельную переменную для слушателя/сервера.
Ответ 8
С последним node.js(v0.3.8-pre): я проверил документацию, проверил экземпляр сервера, возвращенный http.createServer(), и прочитал исходный код server.listen()...
К сожалению, порт временно сохраняется как локальная переменная и заканчивается как аргумент в вызове process.binding('net'). bind(), который является нативным методом. Я не смотрел дальше.
Кажется, что нет лучшего способа, чем сохранить ссылку на значение порта, которое вы предоставили сервер .listen().
Ответ 9
Самый простой способ конвертировать из старого стиля в новый (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);
Ответ 10
req.headers.host.split(':')[1]
Ответ 11
Я тоже задавал себе этот вопрос, затем я пришла Страница Express 4.x, чтобы увидеть этот пример:
var server = app.listen(3000, function() {
console.log('Listening on port %d', server.address().port);
});
Ответ 12
Номер порта можно получить с помощью 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);
});
Ответ 13
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
Ответ 14
findandbind
npm адресует это для выражения/восстановления/подключения: https://github.com/gyllstromk/node-find-and-bind
Ответ 15
ниже простого 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);
Ответ 16
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);
Ответ 17
Более простым способом является вызов app.get('url')
, который предоставляет вам протокол, поддомен, домен и порт.