如何将变量传递给 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));