如何将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
范围,那么范围不再是模块本身。 所以这可能是你的问题。
你能告诉我你使用这个模块代码的一部分吗?