2011-01-30 226 views
85

你經常看到的是創建一個HTTP服務器節點實例的Hello World代碼,開始監聽端口上,然後接着沿着線的東西:NodeJS:如何獲取服務器端口?

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

但最好你想要這個:

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

如何檢索服務器當前正在偵聽,而不調用server.listen()之前存放在變量數量的端口?

我以前見過這樣做,但我無法在Node文檔中找到它。也許這是特定的表達?

+1

查找`REQ。 headers.host` – 2016-01-09 13:14:00

回答

92

快速4.x的答案:

快遞4.x版(每下面田待辦事項的回答),現在把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命令創建的目錄結構:

[email protected]:~/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 
[email protected]:~/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) 
} 
+0

謝謝,我想這正是我要找的。一旦我有機會測試它,我會盡快接受它。乾杯。 – 2011-01-30 20:54:20

+0

歡迎您:) – Alfred 2011-01-30 20:57:02

+11

@Alfred他的歡迎呢? ;) – alex 2013-05-12 21:24:27

5

使用最新的node.js(v0.3.8-pre):我檢查了文檔,檢查了http.createServer()返回的服務器實例,並讀取了server.listen()的源代碼...

不幸的是,端口只能作爲局部變量臨時存儲,並且在調用process.binding('net')。bind()這是一個本地方法時作爲參數結束。我沒有看得更遠。

看起來沒有比保留對server.listen()提供的端口值的引用更好的方法。

+0

+1,並感謝您的研究。自從他找到我正在尋找的確切東西后,我接受了Alfred的回答,但我很高興我知道它現在不在Node核心中。 – 2011-01-31 07:29:56

17

在當前版本(v0.5.0預)端口,似乎可作爲服務器對象上的屬性,參見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 
61

在快遞V3.0,

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

不再起作用!對於快遞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

16

可見如果您使用快遞,你可以從請求對象得到它:

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

在情況下,當你需要在請求處理和應用上的時間的端口不可用,您可以使用此:

request.socket.localPort 
4

從老款到新的(快遞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); 
8

要求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.0測試。導入http從來沒有必要。 listen方法返回一個http服務器對象。 https://github.com/visionmedia/express/blob/master/lib/application.js#L531

2

我問自己這個問題也一樣,後來我才Express 4.x guide page看到這樣的例子:

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

我用這種方式來表示4:

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

通過使用此我不」 t需要爲偵聽器/服務器使用單獨的變量。

0

下面一個簡單的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

的更簡單的方法就是打電話給app.get('url'),它給你的協議,子域,域和端口。

1

您可以通過下面的代碼使用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); 
}); 
1
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

0
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); 
相關問題