57

リバースプロキシの背後にあるアプリケーションがあります。ローカルホスト/127.0.0.1のみをリッスンしたいと思います。

私はこれがうまくいくと思っていました:

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

私はNodev0.6.14express@2.5.5を実行していて、このgoogleグループのディスカッションを読み、Expressapplication.jsでこのコメントを見つけました。「このメソッドはノードと同じ引数を取りますhttp.Server#listen()。」

助けてくれてありがとう。

4

2 に答える 2

65

情報をありがとう、私は問題を見たと思います。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);
});
于 2012-04-09T05:02:24.647 に答える
30

接続が確立される前にログapp.address()をコンソールしようとしているため、この問題が発生しています。接続が確立された後、つまりコールバックまたは接続が確立されたことを通知するイベントの後に、必ずコンソールログを記録する必要があります。

幸い、「listening」イベントは接続が確立された後にサーバーによって発行されるため、次のようにします。

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

これは、nodejsv0.6+およびExpressv3.0+で問題なく機能します。

于 2012-07-19T05:21:45.777 に答える