2013-12-12 52 views
9

我在一箇中間件(function(req, res, next) {...})中。訪問node.js中的HTTP服務器對象express

有沒有辦法從req訪問HTTP服務器對象?

UPDATE

讓我更具體。我試圖找出服務器偵聽的端口,或者unix套接字路徑,如果它在監聽。

+0

有。如果您執行'console.log(req)',則其中一個屬性引用服務器。它沒有記錄,將來可能會改變,但它在那裏。我不知道房產的名稱,因爲我沒有Node,很抱歉。 – Brad

回答

11

如何在你的主應用程序文件:

var express = require('express'); 
var http = require('http'); 
var app = express(); 

app.use(app.router); 

app.get('/', function (req, res, next) { 
    console.log(req.socket.server); 
}); 

app.server = http.createServer(app); 
app.server.listen(3000); 

布拉德提到,快遞確實暴露出類似的東西將對象從#createServer()返回,但是,TJ已經認真考慮丟棄HTTP模塊的任何夾雜物在未來的版本中表達。使用上面的代碼將是安全的。

+0

我非常確定這不起作用,因爲'req.app'沒有被定義:http://expressjs.com/api.html#req.params。請看看我的回答 – verybadalloc

+0

經過測試,它確實有效。還有一個額外的好處,允許你從你的答案不允許的主文件中分離出你的路由/中間件。 – srquinn

+0

剛剛看到布拉德的評論;你是對的,它會工作。但它沒有證件。 – verybadalloc

5

如果你正在嘗試做的是暴露你的路由器裏面的服務器對象,然後是啊,中間件是要走的路:

var express = require('express'); 
var http = require('http'); 
var app = express(); 
var server = http.createServer(app); 

app.use(function(req, res, next){ //This must be set before app.router 
    req.server = server; 
    next(); 
}); 

app.use(app.router); 

server.listen(3000); 

中間件用於公開服務器對象。然後,你可以訪問它在任何你的路由器的像這樣:

app.get('/', function (req, res, next) { 
    console.log(req.server.get('port')); // displays 3000 
}); 
4

出於某種原因,我request.app.server沒有工作,可能是因爲我用快遞4,挖位後,我發現, req.socket.server工程。

+0

奇妙的發現,感謝您的更新 –

3

函數app.listen返回您的http服務器。

快遞/ lib中/ application.js中:

app.listen = function listen() { 
    var server = http.createServer(this); 
    return server.listen.apply(server, arguments); 
};