5

我已经阅读了很多关于如何在 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

4 回答 4

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
于 2013-08-27T20:21:13.137 回答
1

+1为本杰明回答依赖注入。我想添加另一种在模块中注入对象的方法,方法是在 require 中传递依赖项,例如 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]);
           }
        }
    }
}
于 2013-08-27T22:03:11.003 回答
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);

于 2013-08-27T20:22:52.163 回答
0

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

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

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

u.doSomething(myArray);
于 2013-08-27T20:25:08.667 回答