2015-02-07 56 views
5

在我的一個JS文件中包含另一個。我如何在包含模塊中設置變量?如何將變量傳遞到NodeJS模塊?

我覺得做這樣的事會工作

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'; 
+0

想想它發生的順序,然後你會意識到發生了什麼。 – 2015-02-07 09:39:14

回答

13

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 
+0

謝謝,像對象一樣對待模塊是我錯過的概念。其他2個答案也是有幫助的。 – user779159 2015-02-07 10:42:33

1

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

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其範圍是不是不再模塊本身。所以這可能是你的問題。

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

7

與你在做什麼的問題是,你導入後設置變量,但設置你的變量之前,當模塊是進口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個函數,我可以在一個位置將它設置爲像導入時一樣,而不是將它傳遞到每個函數的 ?

不能完全確定,如果我理解你所描述的東西,但你可以做這樣的事情:

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

    return modules; 
}; 

每個子模塊都可以訪問相同的myVar的。所以你可以像上面那樣導入,結果將是一個包含你的五個模塊中的每一個作爲屬性的對象。我不能說這是否是一個好主意,它變得相當複雜,但也許這對您的情況有意義。

+0

在第一個選項中,您將顯示每次獲得不同實例的位置,如何導出多個共享相同'myVar'的函數?如果該模塊導出每個需要'myVar'的5個函數,我可以像導入時一樣將它設置在一個地方,而不是將它傳遞到每個函數中? – user779159 2015-02-07 10:06:59

+1

查看編輯答案。 – 2015-02-07 10:23:44

相關問題