2012-04-09 9 views
31

私はリバースプロキシの背後にあるアプリケーションを持っていますが、localhost/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);です。

私は、Node v0.6.14を実行し、2.5.5 @表現し、このgoogle groups discussionを読んでいると、Expressのthis commentが言っapplication.js発見したのです:「この方法は、ノードのhttp.Server#listen()と同じ引数を取ります」

ありがとうございました。

+0

エラーのスタックトレースを与えることはできますか?テキストを与えるだけではあまり役に立ちません。 – loganfsmyth

+0

編集された質問 – nak

+0

'go.js'ファイルの' 204'行にエラーがあります。その行は何をしていますか?もう少しコードが必要ですか? – loganfsmyth

答えて

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.addressをログコンソールしようとしているので、

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

ありがとう、私はconsole.logをコメントアウトしました...非同期の警告は私にはうれしいことではありませんでした。 – nak

21

は、あなたがこの問題を持っています。接続が行われた後、つまりコールバックで、または接続が確立されたことを通知するイベントの後に、ログを確実にコンソールする必要があります。

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

これはnodejs v0.6 +およびExpressのバージョン3.0 +で正常に動作します:接続が行われた後にこれだけこれを行う

幸いなことに、「リスニング」イベントは、サーバーによって放出されます。

関連する問題