要求返回一个空对象

时间:2014-05-26 17:37:47

标签: node.js

我有一个文件夹,有index.js和几个模型(类) index.js

module.exports = {
   Book : require('./book'),
   Author : require('./author')
}

book.js

var Author = require('./author')
var Book = models.ActiveRecord.extend({
    schema : {
        belongsTo : {
            author : Author
        }
    }
})
module.exports = Book

author.js

var Book = require('./book')
var Author = models.ActiveRecord.extend({
    schema : {
        hasMany : {
            author : Book
        }
    }
})

module.exports = Author

问题是作者类似乎没有找到这本书!它只是一个空对象。 但是,如果我在index.js中切换导出,将Book after作为 - 它可以工作,但随后另一个模型停止工作。

我不想做任何破解工作。

1 个答案:

答案 0 :(得分:169)

这是因为你有一个循环依赖。 Node.js以非常具体的方式处理它:

  1. 第一个模块加载并运行(在本例中为book.js)。它(book.js)将加载并运行第二个模块(author.js),当它(book.js)需要另一个(author.js

  2. 当加载并运行第二个模块(author.js)时,它(author.js)需要第一个模块(book.js),但它(author.js)将收到一个部分填充的对象 - 但是在book.js中的导出设置了许多内容之前,需要author.js将在该对象中

  3. 完全运行book.js后,author.js获取的对象require('./book')将成为完整的book.js模块对象

  4. 有关详细信息,请参阅文档:http://nodejs.org/api/modules.html

    如果可以将该模式动态添加到其中一个ActiveRecord对象,那么这是解决此问题的一种方法。这实际上是一种棘手的情况。事实上,即使没有模块系统,这也会给您带来麻烦。如果您将所有这些代码放在一个文件中,您将如何使其工作?