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

您经常会看到 Node 的 hello world 代码示例,它创建了一个 Http 服务器,开始监听端口,然后按照以下行进行处理:

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

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

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

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

我以前见过这样做,但是在 Node 文档中找不到它?

311138 次浏览

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

遗憾的是,端口只是暂时作为本地变量存储,最终作为 process.binding (‘ net’)调用中的参数存储。Bind ()是一个本机方法。我没有再看下去。

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

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

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

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

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

findandbind npm 为 Express/restify/connect: https://github.com/gyllstromk/node-find-and-bind解决了这个问题

如果在请求处理时需要一个端口,而应用程序不可用,可以使用以下方法:

request.socket.localPort

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

不需要 http 模块。

在 Express 3或者 Express 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

同样,这是在 Express3.5.1和4.0.0中测试的。从来没有必要导入 http。Listen 方法返回一个 http 服务器对象。 Https://github.com/visionmedia/express/blob/master/lib/application.js#l531

我也在问自己这个问题,然后我来到 Express 4. x 指南页看这个样本:

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

我这样使用 Express 4:

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

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

req.headers.host.split(':')[1]

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

可以使用 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的快速服务器

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

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

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

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

你可能在找 process.env.PORT。这允许您使用所谓的“环境变量”动态设置侦听端口。Js 代码如下所示:

const port = process.env.PORT || 3000;
app.listen(port, () => {console.log(`Listening on port ${port}...`)});

您甚至可以使用 export PORT=5000或任何您想要的端口手动设置终端中的动态变量。

Express v4 +

const app = require("express")();
app.listen( 5555, function() {
console.log( this.address().port )
})