在我的一个JS文件中,我包含了另一个。如何在包含的模块中设置变量?
我认为做这样的事情会起作用
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 :(得分:16)
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
答案 1 :(得分:12)
您正在执行的操作的问题是您在导入后设置了变量,但在导入模块之前,在设置变量之前调用了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。所以你将导入如上所述,结果将是一个包含你的五个模块作为属性的对象。我不知道这是不是一个好主意,它变得非常复杂,但也许它对你的情况有意义。
答案 2 :(得分: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
,则作用域不再是模块本身。这可能是你的问题。
您能告诉我您使用此模块代码的部分吗?
答案 3 :(得分:0)
这是一个名为 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));