web-dev-qa-db-ja.com

変数をNodeJSモジュールに渡す方法は?

私のJSファイルの1つに別のファイルを含めます。含まれているモジュールで変数を設定するにはどうすればよいですか?

このようなことがうまくいくと思いました

var mymodule = require('mymodule.js');
mymodule.myvariable = 'test';

そして、mymodule

this.myvariable === 'test';

しかし、これは機能しません。それはundefinedです。値をモジュールに渡すためのさまざまなオプションは何ですか?変数をパラメーターとしてmymoduleで呼び出すすべての関数に追加することもできますが、それは理想的ではありません。

グローバルなしでそれを行う方法はありますか?これにより、このように、必要なさまざまなモジュールで変数を個別に設定できますか?

var mymodule1 = require('mymodule.js');
var mymodule2 = require('mymodule.js');
mymodule1.myvariable = 'test1';
mymodule2.myvariable = 'test2';
11
user779159

NodeJS require()は常にモジュールを一度ロードするので、モジュールのさまざまなインスタンスが独自の内部状態で存在できるモジュールにスコープを実装する必要があります。

次のようなJSクラスとしてモジュールを実装できます。

var MyModule = function(){};

MyModule.prototype.someFunction = function(params){
    this.someVar = params;
}

MyModule.prototype.anotherFunction = function(key, value){
    this[key] = value;
}

module.exports = MyModule;

次に、コードで。

var MyModule = require('MyModule');

someModule = new MyModule();

// treat someModule like an object with its getters/setters/functions
17
Noman Ur Rehman

あなたがやっていたことの問題は、インポート後に変数を設定したが、変数が設定される前にモジュールがインポートされたときにthis.myvariable === 'test';が呼び出されていたことです。

モジュールで関数をエクスポートし、インポート時に関数を呼び出して、変数を引数として渡すことができます。

module.exports = function(myVar) {
  var myModule = {
    // has access to myVar 
    ...
  };

  return myModule; 
};

インポートすると、

var myModule = require('myModule')(myVar);

この方法を使用する場合は、インポートする場所にかかわらず、モジュールの別のインスタンスを取得することに注意してください。

モジュールの外部からモジュールの値を設定する場合は、setterメソッドを使用してモジュールでオブジェクトをエクスポートし、それを使用して変数の値をオブジェクトのプロパティとして設定することをお勧めします。これにより、この値を設定可能にすることがより明確になりますが、myModule.myVar =を実行するだけで、後で混乱する可能性があります。

module.exports = {
  myVar: null,

  setMyVar: function(myVar) {
    this.myVar = myVar;
  },

  ...

};

この場合、インポートする場所にかかわらず、モデルの同じインスタンスにアクセスしています。

コメントに応じて編集

最初のオプションでは、毎回異なるインスタンスを取得する場所を示していますが、それぞれが同じmyVarを共有する複数の関数をエクスポートするにはどうすればよいですか?そのモジュールがmyVarを必要とするそれぞれ5つの関数をエクスポートする場合、それを各関数に渡すのではなく、インポート時のように1つの場所に設定できますか?

あなたが何を言っているのか私が理解しているかどうかは完全にはわかりませんが、次のようなことができます

module.exports = function(myVar) {
  var modules = {};
  modules.someModule = {...};
  modules.anotherModule = {...};
  ...

  return modules;
};

これらの各サブモジュールは、同じmyVarにアクセスできます。したがって、上記のようにインポートすると、5つのモジュールのそれぞれをプロパティとして含むオブジェクトになります。これが良いアイデアかどうかは言えませんが、かなり複雑になっていますが、おそらくあなたの状況には理にかなっています。

13
Adam Stone

うまく動作するはずです。これが実際の例です:

index.js

var module = require('./module.js');
module.myvar = 'Hello world';
module.test();

module.js

module.exports = {
    test: function() {
        console.log('var is', this.myvar);
    }
};

クロージャでthisを使用する場合、スコープがモジュール自体ではなくなることに注意してください。だからあなたの問題かもしれません。

これを使用するモジュールコードの一部を見せていただけますか?

2
Wim Mostmans