如何将variables传递到NodeJS模块?

在我的一个JS文件中包含另一个。 如何在包含的模块中设置variables?

我认为做这样的事情会起作用

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

然后在mymodule

 this.myvariable === 'test'; 

但是这不起作用,它是undefined 。 将值传递给模块的各种选项有哪些? 我可以将variables作为参数添加到myModule中调用的每个函数中,但这并不理想。

有没有办法做到这一点没有全局variables,所以我可以在各种所需的模块独立设置variables,像这样?

 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 

你在做什么的问题是你在导入后设置variables,但是this.myvariable === 'test'; 在你的variables被设置之前,当模块被导入时被调用。

您可以让您的模块导出一个函数,然后在导入时调用该函数,将variables作为parameter passing。

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

当你导入时,

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

如果您使用这种方法,请记住,无论您导入哪个模块,都会得到不同的模块实例,这可能不是您想要的。

如果你想从模块外部设置模块的值,一个好的select是让你的模块用一个setter方法导出一个对象,并用它来设置variables的值作为对象的一个​​属性。 这更清楚地表明,你希望这个值是可以设置的,而只是做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。 所以你可以像上面那样导入,结果是一个包含你的五个模块的对象作为属性。 我不能说这是否是一个好主意,它变得相当复杂,但也许这对您的情况是有意义的。

应该工作得很好。 这是一个工作的例子:

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范围,那么范围不再是模块本身。 所以这可能是你的问题。

你能告诉我你使用这个模块代码的一部分吗?