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

时间:2013-08-27 20:11:53

标签: 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;

 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 :-(

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

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

或者只是将所有东西暴露给所有东西?那是完全凌乱和可怕的吗?

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

谢谢你们! : - )

4 个答案:

答案 0 :(得分: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

这里发生的事情非常简单,我们知道发生了什么。

这也可以是模块范围设置

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

答案 1 :(得分:1)

+1本杰明回答依赖注入。 我想通过在require中传递依赖项('。/ module.js')(dependentFunction)来添加另一种方法来在模块中注入对象;

//MAIN.js
var db = function() {
    this.rows = [];
    this.insert = function(name) {
        this.rows.push(name);
        console.log('Db: Inserting user with name ' + name);
    }
    this.getAll = function(){
        return this.rows;
    }
}
var fakeDb = new db();
var user = require('./user.js')(fakeDb);
user.add('Jhon');
user.add('Rose');
user.list();

//users.js
module.exports = function(db) {
    return {
        add: function(name) {
            db.insert(name);
        },
        list: function() {
           var users =  db.getAll();
           var i = users.length;
           console.log('listing users\n-------');
           while(i--) {
               console.log(users[i]);
           }
        }
    }
}

答案 2 :(得分:0)

您应该将mainFileFunction作为参数传递给用户的构造函数。

USER.JS

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

 module.exports = User;

在你的main.js中使用以下

var u = new user(mainFileFunction);

答案 3 :(得分:0)

如何将mainFileFunction移动到user.js,并让函数接受一个数组作为参数:

mainFileFunction(array) {
   for(thing in array) {
     return array[thing];
   }
 }

然后当你从main.js调用它时,传递你的数组函数:

u.doSomething(myArray);