ファイルに私はこのコードを持っています:
module.exports.greet = function() {...}
同じファイル内からその関数を使いたい。
私はこれがうまくいくと思いました:
this.greet()
しかし、そうではありませんでした。
私が使用しなければならない参照は何ですか?
ファイルに私はこのコードを持っています:
module.exports.greet = function() {...}
同じファイル内からその関数を使いたい。
私はこれがうまくいくと思いました:
this.greet()
しかし、そうではありませんでした。
私が使用しなければならない参照は何ですか?
通常、これは問題なく機能するはずですが、なぜこれが失敗するのかを見てみましょう。
最初にいくつかの背景
何が起こるかというと、それは、、などのexports
他のいくつかのものとともに、モジュールの内容をラップするクロージャーに渡され、次にによって返されるオブジェクトです。require
module
__dirname
exports
require()
参照: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つが作成されたときにのみ読み込まれるため、必ず新しいターミナルを開いてください。
私も同じ問題を抱えていました!他のファイルで変数を参照する方法は、ここで変数を参照する方法と似ています。
試す
modules.exports.foo ...
その変数にアクセスするためのファイル内。
exports.foo ...
また動作するはずです!