如何将变量传递给NodeJS模块?

时间:2015-02-07 09:35:31

标签: javascript node.js variables module global-variables

在我的一个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';

4 个答案:

答案 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));