2012-04-09 80 views
31

我有一個應用程序,我有一個反向代理,我希望它只聽本地/ 127.0.0.1。如何讓Node.JS Express只在本地主機上偵聽?

我預計這個工作:

app.listen(3001, 'localhost');

app.listen(3001, '127.0.0.1');

...而是我得到一個錯誤:

node.js:201 
    throw e; // process.nextTick error, or 'error' event on first tick 
     ^
TypeError: Cannot read property 'port' of null 
    at Object.<anonymous> (/home/ctoledo/hive-go/go.js:204:76) 
    at Module._compile (module.js:441:26) 
    at Object..js (module.js:459:10) 
    at Module.load (module.js:348:31) 
    at Function._load (module.js:308:12) 
    at Array.0 (module.js:479:10) 
    at EventEmitter._tickCallback (node.js:192:40) 

不運行應用程序一個指定的主機名正常工作,即app.listen(3001);

我運行的節點v0.6.14和表達@2.5.5,並已閱讀本google groups discussion,並已發現this comment Express中的application.js說:「這個方法有相同的參數作爲節點的http.Server#listen()

感謝您的任何幫助。

+0

你可以給堆棧跟蹤錯誤嗎?只是給文本不是很有用。 – loganfsmyth 2012-04-09 04:00:47

+0

編輯的問題 – nak 2012-04-09 04:29:53

+0

這是'204'行'go.js'文件中的錯誤。那條線是幹什麼的?你應該多一點代碼? – loganfsmyth 2012-04-09 04:33:53

回答

34

感謝您的信息,認爲我看到了問題。這是僅在添加主機時才顯示的hive-go中的錯誤。它的最後一行是:

app.listen(3001); 
console.log("... port %d in %s mode", app.address().port, app.settings.env); 

當你在第一行添加主機,它是當它調用app.address().port崩潰。

問題是.listen()的潛在異步性質。真的應該是在console.log的調用裏面傳遞一個回調來監聽。當您添加主機時,它會嘗試執行DNS查找,這是異步的。因此,當該線路嘗試獲取地址時,因爲DNS請求正在運行,所以還沒有一個,所以它崩潰了。

試試這個:

app.listen(3001, 'localhost', function() { 
    console.log("... port %d in %s mode", app.address().port, app.settings.env); 
}); 
+0

謝謝,我評論了console.log ...異步警告只是沒有發生在我身上,歡呼! – nak 2012-04-09 05:15:54

21

,因爲你正試圖控制檯登錄app.address()已建立連接之前,你有這個問題。您必須確保在建立連接後進行控制檯日誌記錄,即在回調中或事件發出信號後表示已建立連接。

幸運的是,「聽」事件是由服務器發出的連接之後這樣只是這樣做:

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, 'localhost'); 
server.on('listening', function() { 
    console.log('Express server started on port %s at %s', server.address().port, server.address().address); 
}); 

這個作品在V0.6的NodeJS +和快遞V3.0 +就好了。

相關問題