Module中的NodeJS全局变量

时间:2015-07-22 19:07:06

标签: javascript node.js module

我有很多模块正在根据请求加载。我需要一个仅限于该连接的全局变量,而不是整个代码库的全局范围。

以下是主模块的一些示例代码。

var MainModule = function() {
   // Do something fun

}
MainModule.prototype.Request = function() {
  // Do more fun things
  var Mod = require('./MyModule');
  var MyModule = new Mod(this);
}
module.exports = MainModule;

var MyModule = function(MainModule) {
  // Make MainModule Global ??
  this.MainModule = MainModule;
}

MyModule.prototype.Foo = function() {

  AnotherFunction('321312',function() {
    // Need MainModule in this callback
  }
}
module.exports = MyModule;

我希望MainModule中的this在MyModule中是全局的,当然是另一个名称。我发现处理这个问题的唯一方法是创建this.MyModule但是在每个模块上都很麻烦,而且当有很多子模块时会更麻烦。

是否有一种干净的方法来处理在模块范围内获取可以为Global的变量?

3 个答案:

答案 0 :(得分:0)

这是你想要做的吗?

MyModule.prototype.Foo = function() {
  var that = this;
  AnotherFunction('321312',function() {
    that.MainModule;
  }
}

答案 1 :(得分:0)

如果我理解正确,那么您可以使用以下事实:模块只加载一次然后缓存,以创建一个var,该var将在应用程序的生命周期内存在,但对模块是私有的。它可以在出口之外的模块的顶级范围中定义。你仍然需要在Foo中使用它之前设置一次。

// modules are cached so its like a global to the module
var internalModuleGlobal;

var MyModule = function() {

}

MyModule.prototype.Foo = function() {

  AnotherFunction('321312',function() {
    if(!internalModuleGlobal) throw new Error("set internalModuleGlobal first!"); 
    // Need MainModule in this callback
    internalModuleGlobal.whatever; // accessible via closure
  }
}

// call this once before Foo. doesn't have to be part of MyModule but is for e.
MyModule.prototype.setModuleOnce(mainModule) {
   internalModuleGlobal = mainModule;
}
module.exports = MyModule;

答案 2 :(得分:0)

我能够解决这个问题的唯一方法是将引用传递给每个模块。

var MyModule = function(MainModule) {
  // Set it to pass it so all the methods
  this.MainModule = MainModule;
}

MyModule.prototype.Foo = function() {
  // Set it again to pass it through to any callbacks or sub functions
  var MainModule = this.MainModule;
  AnotherFunction('321312',function() {
    MainModule.SomeMethod(); 
  }
}
module.exports = MyModule;

因此,我需要知道请求或用户信息的代码中加载的每个模块都必须通过它引用变量。

我需要做一些测试,以确保它一直正确引用它,并且永远不会将其复制到新对象中。