一尘不染

Require返回一个空对象

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

问题在于Author类似乎找不到书!它只是一个空对象。但是,如果我在index.js中切换导出,则将Book放在Author之后-
可以,但是其他模型将停止工作。

我不想做任何骇客工作。


阅读 878

收藏
2020-07-07

共1个答案

一尘不染

这是因为您具有循环依赖关系。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模块对象

有关更多信息,请参见以下文档:http :
//nodejs.org/api/modules.html

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

2020-07-07