12

ファイルに私はこのコードを持っています:

module.exports.greet = function() {...}

同じファイル内からその関数を使いたい。

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

this.greet()

しかし、そうではありませんでした。

私が使用しなければならない参照は何ですか?

4

2 に答える 2

13

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

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

参照:https ://github.com/ry/node/blob/master/src/node.js#L327

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

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

// 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.fooにプロパティを設定しません。exports

参照:https
://github.com/ry/node/blob/master/src/node.js#L98 および:https ://github.com/ry/node/blob/master/src/node.js#L296

問題の修正
ノードプロセスに渡された環境変数を確認できます。

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

それNODE_MODULE_CONTEXTSが有効な場合は、ファイル~/.bashrc~/.bash_profileファイルをチェックして、export NODE_MODULE_CONTEXTS=1;それを削除する必要があります。

これらの2つのファイルの変更は、1つが作成されたときにのみ読み込まれるため、必ず新しいターミナルを開いてください。

于 2010-11-30T02:40:24.210 に答える
6

私も同じ問題を抱えていました!他のファイルで変数を参照する方法は、ここで変数を参照する方法と似ています。

試す

 modules.exports.foo ...

その変数にアクセスするためのファイル内。

exports.foo ...

また動作するはずです!

于 2018-08-23T12:01:10.850 に答える