Вы часто видите пример кода hello world для Node, который создает Http-сервер, начинает прослушивание порта, а затем следует что-то вроде:
console.log('Server is listening on port 8000');
Но в идеале вам нужно вместо этого:
console.log('Server is listening on port ' + server.port);
Как мне получить порт, который сервер в настоящее время прослушивает, не сохраняя номер в переменной перед вызовом server.listen()
?
Я видел это раньше, но не могу найти его в документации по Node. Может это что-то конкретное выразить?
javascript
node.js
express
port
Дэвид Танг
источник
источник
req.headers.host
Ответы:
Экспресс 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) }
источник
var listener
вы можете использоватьthis.address().port
внутреннийapp.listen()
обратный вызовthis.address.port()
но не можете использовать это внутри функции стрелки. вам нужно будет использовать старую школуapp.listen(8000, function () { console.log('http://localhost:' + this.address().port); }
(да, я знаю, что обратные кавычки лучше, но я не могу использовать их в комментариях к переполнению стека)В экспресс 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.
источник
0
кserver.listen()
, и в этом случае назначается случайный номер порта. Вы можете сделать это, если вы запускаете несколько приложений Express на одном сервере и не хотите вручную назначать номера портов.app.listen()
также возвращает экземпляр http-сервера.В текущей версии (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
источник
В случае, если вам нужен порт во время обработки запроса, а приложение недоступно, вы можете использовать это:
источник
Если вы используете экспресс, вы можете получить его из объекта запроса:
req.app.settings.port // => 8080 or whatever your app is listening at.
источник
Я использую такой способ Express 4:
app.listen(1337, function(){ console.log('Express listening on port', this.address().port); });
Используя это, мне не нужно использовать отдельную переменную для слушателя / сервера.
источник
this
будет неопределенным.В требовании модуля 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источник
С последней версией node.js (v0.3.8-pre): я проверил документацию, проверил экземпляр сервера, возвращенный http.createServer (), и прочитал исходный код server.listen () ...
К сожалению, порт хранится только временно как локальная переменная и заканчивается как аргумент в вызове process.binding ('net'). Bind (), который является собственным методом. Я не смотрел дальше.
Похоже, что нет лучшего способа, чем сохранить ссылку на значение порта, которое вы указали для server.listen ().
источник
Самый простой способ преобразовать старый стиль в новый (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);
источник
req.headers.host.split(':')[1]
источник
Я тоже задавал себе этот вопрос, затем я зашел на страницу руководства Express 4.x, чтобы увидеть этот образец:
var server = app.listen(3000, function() { console.log('Listening on port %d', server.address().port); });
источник
Вы можете получить номер порта, используя
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); });
источник
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); });
источник
Если вы не указали номер порта и хотите знать, на каком порту он работает.
let http = require('http'); let _http = http.createServer((req, res) => { res.writeHead(200); res.end('Hello..!') }).listen(); console.log(_http.address().port);
FYI, каждый раз он будет работать в другом порту.
источник
В
findandbind
НПМ адресе это для экспресса / restify / подключения: https://github.com/gyllstromk/node-find-and-bindисточник
ниже простой 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);
источник
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);
источник
Более простой способ - просто позвонить
app.get('url')
, что даст вам протокол, поддомен, домен и порт.источник