2016-06-29 5 views
1

NodeJSを学び、The Node Beginnerブックに記載されている単純なHTTPサーバーを作成し始めました。私はRouterオブジェクトを持っています。このオブジェクトには、パス名を呼び出す関数にマップするルーティングtableが含まれています。これは、キー値オブジェクトによって実現されます。JavaScriptとNode.JS - コールバックの変数が定義されていない理由を理解できない

ここで、私のServerオブジェクトは、上記のオブジェクトを指すrouterメンバを持っています。 (疎結合の場合は、ルータとサーバの別名を保持しています)、サーバを起動する方法はstart()です。これは下記の通りである:

Server.prototype.start = function() { 
    var myRouter = this.router; 
    http.createServer(function(req, res) { 
     var path = url.parse(req.url).pathname; 
     res.write(myRouter.route(path, null)); 
     res.end(); 
    }).listen(80); 
}; 

今私はそれがroute()関数の使用してルーティングを行う、createServer関数で次にServerオブジェクトのrouter基準を指すmyRouter変数を作成し、そしてました。このコードは機能します。しかし、私はmyRouter可変部分を作成省略した場合と、直接このようcreateServerでルーティングを実行します。それはthis.routerが定義されていないと言う

res.write(this.router.route(path, null)); 

。私はこれがスコープと関係があることを知っています。なぜなら、createServerに提供された関数は、要求が受信されるたびに後で実行されるからです。しかし、myRouterがこの問題を解決する方法を理解できません。どんな助けでも大歓迎です。

+1

この問題は、「this」がどのように動作するかで、スコープなどとはあまり関係がありません。 –

+0

参照:http://stackoverflow.com/questions/3127429/how-does-the-this-keyword-work – Paulpro

+0

ありがとう、両方に。提案された答えを読み上げます。 –

答えて

1

機能は、それらが作成された環境、(Closureを)覚えているので、変数myRourerは、問題を解決します。したがって、コールバックはmyRouter変数を知っています

問題のもう1つの解決策は、バインドメソッド(bind)を使用してコールバックのこの値を特定のオブジェクトに設定することです。

1
In the request callback , 

function(req, res) { 
     var path = url.parse(req.url).pathname; 
     res.write(myRouter.route(path, null)); 
     res.end(); 
    } 

'this' doesnot refer to your outer Server. To use this inside this callback use bind. 

Server.prototype.start = function() { 
    var myRouter = this.router; 
    http.createServer(function(req, res) { 
     var path = url.parse(req.url).pathname; 
     res.write(myRouter.route(path, null)); 
     res.end(); 
    }.bind(this)).listen(80); 
}; 
+0

trueですが、 'myRouter'がどのように正しく参照されていますか? –

+0

あなたのmyRouterはサーバ内で宣言されていますが、内部サーバではありませんcreateserver callbacl どうしてですか –

+0

なぜあなたのコード全体をコードとしてフォーマットしますか? –

関連する問題