Вимагати повертає порожній об’єкт


125

У мене папка, в якій є 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, ставлячи «Книгу за автором» - вона працює, але тоді інша модель перестає працювати.

Я не хочу робити жодних хак, щоб це спрацювало.


4
Author.js для запуску Book.js потрібен Book.js, а Book.js для запуску потрібен Author.js? Приберіть кругову залежність.
— Філіп Гейрет

1
Що це за об’єкт ActiveRecord? Звідки воно?
— BT

Відповіді:


207

Це тому, що у вас кругла залежність. Node.js обробляє це дуже специфічним чином:

  1. Перший модуль завантажується і запускається (у цьому випадку book.js). Він ( book.js) завантажить і запустить другий модуль ( author.js), коли він ( book.js) вимагає іншого ( author.js)

  2. Коли другий модуль ( author.js) завантажується та запускається, йому ( author.js) потрібен перший модуль ( book.js), але він ( author.js) отримає частково заповнений об'єкт - проте багато було встановлено на експорт у book.js, перш ніж це вимагатиме автор.js бути в цьому об’єкті

  3. Після book.jsповного запуску об'єкт, author.jsотриманий з, require('./book')буде повним book.jsоб'єктом модуля

Для отримання додаткової інформації, ось документи: http://nodejs.org/api/modules.html

Якщо можливо динамічно додати цю схему до одного з цих об’єктів ActiveRecord, це один із способів вирішити це. Це насправді така хитра ситуація. Насправді навіть без модульної системи це може спричинити проблеми для вас. Якщо ви помістите весь цей код в один файл, як би ви зробили це?


1
Я знаю, що ви не повинні ставити все в один файл, але я кажу просто експериментуйте так. Моя думка, що тут не проблема модульної системи node.js, а саме код.
— BT

Власне кажучи, у Java є ті ж самі проблеми з циркулярними залежностями - це проблема, яку може мати будь-яка мова. Якщо все, що вам потрібно, - це посилання на вашого партнера з кругової залежності, javascript може це зробити так само просто, як і java. Однак тут ви намагаєтеся використати об’єкт до його побудови (в розширенні)
— BT

Так, насправді зараз я це зрозумів. Ніколи не прийшов до тями. Отже, є лише один спосіб - додати це динамічно, я думаю. Або передавання назви моделі у вигляді рядка. Дякую за Вашу відповідь!
— користувач3677173

18
Я настійно рекомендую Madge для налагодження подібних питань у більш складних випадках (тобто з більшою кількістю файлів). Після встановлення ви madge -c <app entry point>зможете виявити будь-які кругові залежності.
— schu34

7
Дякую. Досить болісно, ​​що він навіть не видає помилки, а просто повертає порожній об’єкт.
— Роберт Ошлер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.