如何将变量传递给 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';
应该可以正常工作。这是一个工作示例:
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
,则范围不再是模块本身。所以这可能是你的问题。
你能告诉我你使用它的模块代码部分吗?
NodeJS require()
将始终加载模块一次,因此您需要在模块中实现范围界定,模块的不同实例可以存在并具有自己的内部状态。
您可以将模块实现为 JS class,例如:
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 方法导出一个对象,并使用它来设置变量的值作为a 属性 的对象。这更清楚地表明您希望此值是可设置的,而仅执行 myModule.myVar =
会让您以后感到困惑。
module.exports = {
myVar: null,
setMyVar: function(myVar) {
this.myVar = myVar;
},
...
};
在这种情况下,无论您将模型导入何处,您都将访问该模型的同一实例。
编辑回复评论
In the first option you show where you get a different instance each
time, how can I export multiple functions that each share the same
myVar? If that module exports 5 functions each that need myVar, can I
set it in one place like at import time rather than passing it into
each function?
不完全确定我是否理解你所描述的内容,但你可以这样做:
module.exports = function(myVar) {
var modules = {};
modules.someModule = {...};
modules.anotherModule = {...};
...
return modules;
};
这些子模块中的每一个都可以访问同一个 myVar。因此,您将按上述方式导入,结果将是一个对象,其中包含五个模块中的每一个作为属性。我不能说这是否是个好主意,它变得相当复杂,但也许它对你的情况有意义。
这是一个名为 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));
在我的一个 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';
应该可以正常工作。这是一个工作示例:
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
,则范围不再是模块本身。所以这可能是你的问题。
你能告诉我你使用它的模块代码部分吗?
NodeJS require()
将始终加载模块一次,因此您需要在模块中实现范围界定,模块的不同实例可以存在并具有自己的内部状态。
您可以将模块实现为 JS class,例如:
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 方法导出一个对象,并使用它来设置变量的值作为a 属性 的对象。这更清楚地表明您希望此值是可设置的,而仅执行 myModule.myVar =
会让您以后感到困惑。
module.exports = {
myVar: null,
setMyVar: function(myVar) {
this.myVar = myVar;
},
...
};
在这种情况下,无论您将模型导入何处,您都将访问该模型的同一实例。
编辑回复评论
In the first option you show where you get a different instance each time, how can I export multiple functions that each share the same myVar? If that module exports 5 functions each that need myVar, can I set it in one place like at import time rather than passing it into each function?
不完全确定我是否理解你所描述的内容,但你可以这样做:
module.exports = function(myVar) {
var modules = {};
modules.someModule = {...};
modules.anotherModule = {...};
...
return modules;
};
这些子模块中的每一个都可以访问同一个 myVar。因此,您将按上述方式导入,结果将是一个对象,其中包含五个模块中的每一个作为属性。我不能说这是否是个好主意,它变得相当复杂,但也许它对你的情况有意义。
这是一个名为 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));