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


142

您经常会看到Node的示例hello world代码,该代码创建Http Server,开始侦听端口,然后执行以下操作:

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

但理想情况下,您希望这样做:

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

如何在调用前不将服务器号存储在变量中的情况下检索服务器当前正在侦听的端口server.listen()

我之前已经看过这件事,但是在Node文档中找不到。也许这是表达的特定内容?


3
寻找req.headers.host
Andrew_1510 '16

Answers:


160

Express 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)
}

1
谢谢,我认为这正是我想要的。只要有机会进行测试,我就会接受。干杯。
David Tang

4
而且,如果您不想使用该变量var listener,则可以this.address().portapp.listen()回调内部使用
Andrei Stalbe,2016年

在Express 5.x中看起来像什么?
Diogenes'7

2
您还可以在中间件中的任何位置获取端口:req.socket.address()。port
jlguenego,

只需添加@AndreiStalbe所说的内容,就可以使用,this.address.port()但不能在箭头函数中使用它。您将需要上旧学校app.listen(8000, function () { console.log('http://localhost:' + this.address().port); }(是的,我知道反引号会更好,但我不能在堆栈溢出注释中这样做)
WORMSS

65

在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中可见


或者,您可以使用旧的创建服务器的方法,该方法仍然有效。似乎似乎不再有访问端口后记的方法。但是,由于您是在对server.listen的调用中自行指定端口,因此实际上不需要使用server.address()。port,因为您可以使用传递给server.listen的相同值。
玛丽·哈姆林

(尽管我刚刚阅读了迁移指南,并且看到上面提到的用于创建应用和服务器的方法实际上是新的首选方法。)
Mary Hamlin 2012年

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

app.listen()还返回http服务器实例。
Vicary 2014年

23

在当前版本(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

22

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

request.socket.localPort

17

如果您使用的是Express,则可以从request对象获取它:

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

14

我使用这种方式Express 4:

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

通过使用此选项,我不需要为侦听器/服务器使用单独的变量。


1
到目前为止最好的答案!如果您使用的是ES6,请不要使用箭头功能。this将是不确定的。
Laxmana

9

不需要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


6

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

可悲的是,端口仅作为本地变量临时存储,并最终作为对本机方法process.binding('net')。bind()的调用中的参数而结束。我没有进一步看。

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


1
+1,感谢您的研究。我接受了Alfred的回答,因为他找到了我想要的确切内容,但我很高兴知道它现在不在Node核心中。
David Tang

5

从旧样式转换为新(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);


3

我也问自己这个问题,然后我来到Express 4.x指南页面查看此示例:

var server = app.listen(3000, function() {
   console.log('Listening on port %d', server.address().port);
});

2
但是我不知道为什么本地开发计算机(OSX)上的server.address()。address始终为0.0.0.0。

这应该添加到接受的答案中,因为Express 4.0不再将app.listen()视为同步操作,并且您现在需要在回调中运行listener.address()。
RavenHursT 2015年

3

您可以使用server.address().port 以下代码中的like 来获取端口号:

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

3
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上侦听


2

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

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

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



-1

下面的简单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);

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

-2

更简单的方法是调用app.get('url'),它为您提供了协议,子域,域和端口。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.