NodeJS:如何获取服务器的端口?

您经常会看到Node的示例hello world代码,它创build一个Http Server,开始监听一个端口,然后是以下内容:

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

但理想情况下,你会想要这个:

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

如何在调用server.listen()之前检索服务器当前正在侦听的端口,而不将该号码存储在variables中?

我以前见过这个,但是我在Node文档中找不到它。 也许这是特定的expression?

Express 4.x回答:

Express 4.x(以下是Tien Do的回答),现在将app.listen()视为一个asynchronous操作,所以listener.address()将只返回app.listen()的callback中的数据:

 var app = require('express')(); var listener = app.listen(8888, function(){ console.log('Listening on port ' + listener.address().port); //Listening on port 8888 }); 

快递3回答:

我想你正在寻找这个(具体expression?):

 console.log("Express server listening on port %d", app.address().port) 

你可能已经看到了这个(底线),当你从express命令创build目录结构时:

 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,您应该这样创build一个应用程序和一个服务器:

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

我自己碰到这个问题,想要logging新的语法。 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 

如果您使用快递,您可以从请求对象中获取:

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

如果您在请求处理时需要端口并且应用程序不可用,则可以使用以下命令:

 request.socket.localPort 

不需要http模块。

在Express 3或4中,不需要额外导入http指定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.0testing。 导入http从来没有必要。 listen方法返回一个http服务器对象。 https://github.com/visionmedia/express/blob/master/lib/application.js#L531

我用这种方式快车4:

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

通过使用这个我不需要使用一个单独的variables为侦听器/服务器。

使用最新的node.js(v0.3.8-pre):我检查了文档,检查了http.createServer()返回的服务器实例,并读取了server.listen()的源代码。

不幸的是,这个端口只能作为一个局部variables临时存储,并在调用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); }); 

Express服务器在端口8881上侦听

findandbind npm解决这个expression/ 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') ,它给你的协议,子域,域和端口。