163

你经常看到 Node 的示例 hello world 代码,它创建一个 Http 服务器,开始监听一个端口,然后是类似下面的代码:

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

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

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

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

我以前见过这样做,但我在 Node 文档中找不到它。也许这是要表达的特定内容?

4

18 回答 18

180

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)
}
于 2011-01-30T12:28:29.767 回答
66

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

我自己遇到了这个问题,想记录下新的语法。在https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x上可以看到 Express v3.0 中的这一变化和其他变化

于 2012-07-19T05:04:15.647 回答
27

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

request.socket.localPort
于 2014-02-25T02:36:23.480 回答
26

在当前版本(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
于 2011-05-12T12:57:15.780 回答
21

我用这种方式表达 4:

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

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

于 2015-03-16T11:25:58.333 回答
17

如果您使用的是 express,您可以从请求对象中获取它:

req.app.settings.port // => 8080 or whatever your app is listening at.
于 2012-10-21T08:25:14.270 回答
10

从来没有必要要求 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

于 2014-04-15T05:29:18.437 回答
8
req.headers.host.split(':')[1]
于 2016-06-22T01:42:05.287 回答
6

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

遗憾的是,该端口仅作为局部变量临时存储,并最终作为对本机方法 process.binding('net').bind() 的调用中的参数。我没有再看下去。

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

于 2011-01-30T10:51:31.470 回答
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);
于 2014-03-12T15:03:37.087 回答
4

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

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

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

于 2019-03-17T09:03:17.087 回答
4

您可以使用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);
});
于 2017-04-04T06:50:24.723 回答
3

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

var server = app.listen(3000, function() {
   console.log('Listening on port %d', server.address().port);
});
于 2014-10-02T06:18:04.960 回答
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 端口

于 2017-04-04T08:00:29.287 回答
0

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

于 2013-12-12T13:53:46.017 回答
0

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

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

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

于 2020-11-18T15:15:34.167 回答
-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);
于 2017-07-13T13:39:18.393 回答
-2

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

于 2016-09-16T12:53:27.287 回答