簡體   English   中英

如何將變量傳遞給 NodeJS 模塊?

[英]How to pass variables into NodeJS modules?

在我的一個 JS 文件中,我包含了另一個。 如何在包含的模塊中設置變量?

我認為做這樣的事情會奏效

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

然后在我的模塊中

this.myvariable === 'test';

但這不起作用,它是undefined 將值傳遞給模塊的各種選項是什么? 我可以將變量作為參數添加到我在 mymodule 中調用的每個函數,但這並不理想。

有沒有辦法在沒有全局變量的情況下做到這一點,這樣我就可以在各種所需的模塊中獨立設置變量,像這樣?

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

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

你所做的問題是你在導入后設置了變量,但是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 的多個函數? 如果該模塊導出 5 個函數,每個函數都需要 myVar,我可以在導入時將其設置在一個地方,而不是將其傳遞給每個函數嗎?

不完全確定我是否理解你的描述,但你可以做這樣的事情:

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

  return modules;
};

這些子模塊中的每一個都可以訪問相同的 myVar。 因此,您將按上述方式導入,結果將是一個對象,其中包含五個模塊中的每一個作為屬性。 我不能說這是否是一個好主意,它變得非常復雜,但也許它對您的情況有意義。

應該工作得很好。 這是一個工作示例:

索引.js

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

模塊.js

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

請記住,如果您在閉包中使用this ,則范圍不再是模塊本身。 所以這可能是你的問題。

你能告訴我你使用它的模塊代碼部分嗎?

這是一個名為 StrUpperCase.js 的模塊

exports.StrUpperCase = function(str) {
    return str.toUpperCase();
}

在 app.js 中:

var str = "Welcome World...";
const SUC = require('./modules/StrUpperCase');
console.log(SUC.StrUpperCase(str));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM