Требовать возвращает пустой объект

У меня есть папка с индексом .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 Author - он работает, но затем другая модель перестает работать.

Я не хочу делать хаки, чтобы заставить его работать.

Ответ 1

Это потому, что у вас есть круговая зависимость. Node.js обрабатывает это очень определенным образом:

  • Первый модуль загружается и запускается (в данном случае book.js). Он (book.js) будет загружать и запускать второй модуль (author.js), когда он (book.js) требует другого (author.js)

  • Когда второй модуль (author.js) загружается и запускается, ему (author.js) требуется первый модуль (book.js), но он (author.js) получит частично заполненный объект, однако многие вещи были установлены на экспорт в book.js, прежде чем требуется, чтобы author.js был в этом объекте

  • После завершения book.js объект author.js, полученный из require('./book'), будет полным объектом модуля book.js

Для получения дополнительной информации, здесь docs: http://nodejs.org/api/modules.html

Если возможно динамически добавить эту схему к одному из этих объектов ActiveRecord, это один из способов решить эту проблему. На самом деле это довольно сложная ситуация. Фактически, даже без модульной системы это может вызвать проблемы для вас. Если вы поместите весь этот код в один файл, как вы его заработаете?