2010-11-30 19 views
9

内からmodule.exportsはを取得します。私はこのコードを持っているファイルで同じファイル

私はこれが働くだろうと思った:

this.greet() 
しかし、それはしませんでした。

私は使用しなければならないリファレンスは何ですか?

+0

ちょうど私の環境のvaraibleに関する答えがあなたに役立ったかどうか尋ねたかった、そうでなければこれは提出する必要がありますバグかもしれません:) –

答えて

11

通常、これはうまくいくはずですが、なぜ失敗するのかを見てみましょう。

最初のいくつかの背景
は何が起こるかというとexportsはその後で、exportsrequiremodule__dirnameのようないくつかの他のものと一緒に、モジュールの内容をラップクロージャーに渡される、オブジェクトがあるということですrequire()によって返されました。

見る:モジュール内https://github.com/ry/node/blob/master/src/node.js#L327

thismoduleは、オブジェクトは、exportsオブジェクトへの参照を保持し、exportsオブジェクトを指します。モジュール内の名前空間はクロージャを介して提供されます。

最後に、グローバル名空間を提供し、processのようなものをホストするglobalオブジェクトもあります。問題

// main.js 
this.bla = function(){} // sets bla on the the exports object 
require('./sub'); 
console.log(this); // { bla: [Function] } 
console.log(exports); // { bla: [Function] } 
console.log(module); /* { id: '.', 
          exports: { bla: [Function] }, 
          parent: undefined, 
          filename: '/home/ivo/Desktop/main.js', 
          loaded: false, 
          exited: false, 
          children: [] } */ 

// sub.js 
this.greet = function() {} // sets greet on the exports object 
console.log(this); // { greet: [Function] } 
console.log(exports); // { greet: [Function] } 
console.log(module); /* { id: './sub', 
          exports: { greet: [Function] }, 
          parent: 
          { id: '.', 
          exports: { bla: [Function] }, 
          parent: undefined, 
          filename: '/home/ivo/Desktop/main.js', 
          loaded: false, 
          exited: false, 
          children: [] }, 
         filename: '/home/ivo/Desktop/sub.js', 
         loaded: false, 
         exited: false, 
         children: [] } */ 

原因あなたのコードが動作しないという事実のための唯一の説明は、環境変数NODE_MODULE_CONTEXTSがゼロより大きな整数に設定されたことです。

この場合、モジュールは独自のコンテキストで実行されます。メインモジュール内のthisは、globalオブジェクトとその内側のサブモジュールを参照するため、サンドボックスオブジェクトを参照します。したがって、this.fooexportsオブジェクトにプロパティを設定しません。

参照:https://github.com/ry/node/blob/master/src/node.js#L98
そして:NODE_MODULE_CONTEXTSがである場合には

console.log(process.env); // get a list of all variables 

// get just the one that's causing trouble, if this returns a number > 0 then it's in effect 
console.log(process.env['NODE_MODULE_CONTEXTS']); 

https://github.com/ry/node/blob/master/src/node.js#L296

問題
を修正あなたはノードのプロセスに渡された環境変数を確認することができますあなたの~/.bashrc~/.bash_profileファイルにexport NODE_MODULE_CONTEXTS=1;のようなものをチェックする必要があります。 それを除く。

これらの2つのファイルの変更は、作成時にのみ読み込まれるため、必ず新しい端末を開くようにしてください。

関連する問題