NodeJS: как получить порт сервера?
вы часто видите пример кода hello world для узла, который создает Http-сервер, начинает прослушивать порт, а затем следует что-то вроде:
console.log('Server is listening on port 8000');
но в идеале вы хотели бы это вместо:
console.log('Server is listening on port ' + server.port);
как мне получить порт, который в настоящее время прослушивает сервер, не сохраняя номер в переменной до вызова server.listen()?
Я видел это раньше, но я не могу найти его в документации узла. Может быть, это что-то конкретно выражать?
17 ответов:
Экспресс-4.х ответ:
Экспресс-4.x (per Tien Do's answer below), теперь лечит приложение.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) }
в 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
в текущей версии (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
Если вы используете Express, вы можете получить его из объекта запроса:
req.app.settings.port // => 8080 or whatever your app is listening at.
в случае, когда вам нужен порт на момент обработки запроса и приложение не доступно, вы можете использовать это:
request.socket.localPort
Я использую этот способ Экспресс 4:
app.listen(1337, function(){ console.log('Express listening on port', this.address().port); });С помощью этого мне не нужно использовать отдельную переменную для слушателя/сервер.
требование модуля 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
с последним узлом.js (v0.3.8-pre): я проверил документацию, проверил экземпляр сервера, возвращенный http.createServer (), и прочитать исходный код сервера.слушать.)(..
к сожалению, порт хранится только временно как локальная переменная и заканчивается как аргумент в вызове процесса.привязка ('net').bind (), который является собственным методом. Я не стал смотреть дальше.
кажется, что нет лучшего способа, чем сохранить ссылку на значение порта, которое вы предоставили на сервер.слушать.)(
самый простой способ конвертировать из старого стиля в новый (экспресс 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);
Я тоже задавал себе этот вопрос, потом пришел Экспресс-4.х руководство страницы чтобы просмотреть этот пример:
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); });Экспресс-сервер прослушивает порт 8881
на
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);
Comments