node.js将变量暴露给模块?

And*_*ips 4 javascript node.js

我已经阅读了很多关于如何在node.js中创建模块的文章,你可以使用module.exports将模块内部公开给包含它的文件.真棒!

这是怎么回事?我将使用以下作为示例:-)

 USER.JS

 function User() {
   this.property = 'value';
   this.doSomething = function() {
     var getStuff = mainFileFunction();
     // do something with getStuff
 }

 module.exports = User;
Run Code Online (Sandbox Code Playgroud)
 MAIN.JS

 var myArray = [];
 myArray.push('something');
 myArray.push('something else');
 mainFileFunction() {
   for(thing in myArray) {
     return myArray[thing];
   }
 }

 var u = new user();

 log(u.property);  <---  THIS IS EXPOSED, COOL!

 u.doSomething();  <--- This will throw an error because mainFileFunction is not defined in user.js :-(
Run Code Online (Sandbox Code Playgroud)

如果我将mainFileFunction移动到用户文件,那么它仍然无法工作,因为myArray数组不会被定义...如果我也将它移动到那里,我将无法在主要的其他功能(我想):-)

我很抱歉,如果我错过了一些非常明显的东西......我想要的是从我包含的模块中公开我选择的部分(module.export适用于此)但我也希望从主文件中公开所有内容所有包括..

或者只是把一切都暴露在一切?那是完全凌乱和可怕的吗?

只是为了解释我在这里尝试做什么...我希望在单独的文件中定义类,但我想将它们实例化为主文件中的对象并将它们存储在数组中.我希望对象能够包含可以访问其他对象类型的数组的方法.

多谢你们!:-)

Ben*_*aum 7

可以使用全局变量,或者具有适当的循环依赖性(require两个文件),但这通常是一个坏习惯,可能导致将来出现可维护性问题.

相反,您可以使用依赖注入并注入doSomething模块.这基本上免费提供以下内容:

  • 您可以User使用doSomething稍后的简单模拟实现进行测试,并验证代码的正确性
  • 用户的依赖关系是显式的而不是隐式的,这使得用户需要的东西显而易见.

我将提供两个实现,一个使用构造函数依赖注入,另一个使用模块范围设置.

 USER.JS

 function User(dependentFunction) {
   this.property = 'value';
   this.doSomething = function() {
     var getStuff = dependentFunction();
     // do something with getStuff
   }
 }

 module.exports = User;

MAIN.JS
...
var u = new User(mainFileFunction);
u.doSomething(); // this will now work, using mainFileFunction
Run Code Online (Sandbox Code Playgroud)

这里发生的事情相当简单,我们知道发生了什么.

这也可以是模块范围设置

USER.JS

function User(depFunc) {
  this.property = 'value';
  this.doSomething = function() {
    var getStuff = depFunc();
    // do something with getStuff
  }
}
function UserFactory(depFunc){ 
    return function(){
        return new User(depFunc);
    }
}
module.exports = UserFactory;

MAIN.JS

 var getUser = UserFactory(mainFileFunction);
 var u = getUser(); // will return a new user with the right function
Run Code Online (Sandbox Code Playgroud)