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

Dav*_*ang 125 javascript port node.js express

您经常会看到用于创建Http Server的Node的示例hello world代码,开始侦听端口,然后是以下内容:

console.log('Server is listening on port 8000');
Run Code Online (Sandbox Code Playgroud)

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

console.log('Server is listening on port ' + server.port);
Run Code Online (Sandbox Code Playgroud)

如何检索服务器当前正在侦听的端口,而不是在调用之前将数字存储在变量中server.listen()

我以前见过这个,但我在Node文档中找不到它.也许这是特定的表达方式?

Alf*_*red 146

快递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
});
Run Code Online (Sandbox Code Playgroud)

快递3回答:

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

console.log("Express server listening on port %d", app.address().port)
Run Code Online (Sandbox Code Playgroud)

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)
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你不想拥有变量`var listener`你可以在`app.listen()`回调中使用`this.address().port` (4认同)
  • 您还可以在中间件中的任何位置获取端口:req.socket.address().port (3认同)

dgh*_*dgh 64

在快递v3.0中,

/* No longer valid */
var app = express.createServer();
app.listen();
console.log('Server running on %s', app.address().port);
Run Code Online (Sandbox Code Playgroud)

不再有效!对于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);
Run Code Online (Sandbox Code Playgroud)

我自己跑到这个问题,想要记录新的语法.可以在https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x上看到Express v3.0中的此更改和其他更改.

  • @MaryHamlin:如果你将`0`传递给`server.listen()`,这很有用,在这种情况下会分配一个随机端口号.如果您在一台服务器上运行多个Express应用程序并且不想手动分配端口号,则可以执行此操作. (3认同)

Jör*_*ann 22

在当前版本(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);
Run Code Online (Sandbox Code Playgroud)

输出

{ address: '0.0.0.0', port: 8088 }
0.0.0.0
8088
Run Code Online (Sandbox Code Playgroud)


cho*_*ovy 17

如果您正在使用express,则可以从请求对象获取它:

req.app.settings.port // => 8080 or whatever your app is listening at.
Run Code Online (Sandbox Code Playgroud)


小智 17

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

request.socket.localPort
Run Code Online (Sandbox Code Playgroud)


Chr*_*ren 14

我用这种方式快递4:

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

通过使用它,我不需要为侦听器/服务器使用单独的变量.

  • 迄今为止最好的答案!如果您使用的是 ES6,请不要使用箭头函数。`this` 将是未定义的。 (5认同)

jam*_*ack 9

需要HTTP模块是从来没有必要的.

的额外进口http是不是在快递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
Run Code Online (Sandbox Code Playgroud)

再次,这是在快递3.5.1和4.0.0进行测试.进口http从来没有必要的.监听方法返回一个HTTP服务器对象. https://github.com/visionmedia/express/blob/master/lib/application.js#L531


小智 9

如果您没有定义端口号并且您想知道它在哪个端口上运行。

let http = require('http');
let _http = http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello..!')
}).listen();
console.log(_http.address().port);
Run Code Online (Sandbox Code Playgroud)

仅供参考,每次它都会在不同的端口运行。


KAR*_*N.A 8

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); 
});
Run Code Online (Sandbox Code Playgroud)

Express 服务器监听 8881 端口


Shu*_*rma 7

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);
});
Run Code Online (Sandbox Code Playgroud)


Eri*_*ier 6

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

遗憾的是,端口仅作为局部变量临时存储,并在调用process.binding('net').bind()时最终作为参数,这是一种本机方法.我没有看得更远.

似乎没有比保持对server.listen()提供的端口值的引用更好的方法了.


Way*_*inn 5

从旧样式转换为新(Express 3.x)样式的最简单方法是这样的:

var server = app.listen(8080);
console.log('Listening on port: ' + server.address().port);
Run Code Online (Sandbox Code Playgroud)

Pre 3.x的工作原理如下:

/* This no longer works */
app.listen(8080);
console.log('Listening on port: ' + app.address().port);
Run Code Online (Sandbox Code Playgroud)


Roc*_*wer 5

req.headers.host.split(':')[1]
Run Code Online (Sandbox Code Playgroud)