Wymagaj zwraca pusty obiekt


126

Mam folder zawierający index.js i kilka modeli (klas) 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

Problem w tym, że klasa Autor nie wydaje się znaleźć książki! To po prostu pusty obiekt. Jeśli jednak zmienię eksport w index.js, stawiając książkę po autorze - działa, ale wtedy drugi model przestaje działać.

Nie chcę robić żadnych hacków, aby to zadziałało.


4
Author.js potrzebuje do uruchomienia Book.js, a Book.js potrzebuje Author.js do uruchomienia? Usuń zależność cykliczną.
— Philipp Gayret

1
Co to za obiekt ActiveRecord? Skąd to jest?
— BT

Odpowiedzi:


208

Dzieje się tak, ponieważ masz zależność cykliczną. Node.js obsługuje to w bardzo specyficzny sposób:

  1. Pierwszy moduł ładuje się i uruchamia (w tym przypadku book.js). It ( book.js) załaduje i uruchomi drugi moduł ( author.js), gdy ( book.js) wymaga innego ( author.js)

  2. Kiedy drugi moduł ( author.js) jest ładowany i uruchamiany, to ( author.js) wymaga pierwszego modułu ( book.js), ale ( author.js) otrzyma częściowo wypełniony obiekt - jednak wiele rzeczy zostało ustawionych w eksporcie w book.js, zanim wymagał on author.js być w tym obiekcie

  3. Po book.jscałkowitym uruchomieniu obiekt author.jsotrzymany z require('./book')będzie book.jsobiektem pełnego modułu

Więcej informacji można znaleźć w dokumentacji: http://nodejs.org/api/modules.html

Jeśli możliwe jest dynamiczne dodanie tego schematu do jednego z tych obiektów ActiveRecord, jest to jeden ze sposobów rozwiązania tego problemu. To właściwie dość trudna sytuacja. W rzeczywistości nawet bez systemu modułowego spowodowałoby to problemy. Gdybyś umieścił cały ten kod w jednym pliku, jak by to działało?


1
Wiem, że nie powinieneś umieszczać wszystkiego w jednym pliku, ale mówię po prostu po prostu eksperymentuj w ten sposób. Chodzi mi o to, że to nie system modułów node.js jest przyczyną problemu, ale sam kod.
— BT

W rzeczywistości Java ma te same problemy z zależnościami circus - jest to problem, który może mieć każdy język. Jeśli potrzebujesz tylko odniesienia do partnera w zakresie zależności cyklicznych, javascript może to zrobić równie łatwo jak java. Jednak tutaj próbujesz wykorzystać obiekt przed jego zbudowaniem (w rozszerzeniu)
— BT

Tak, właściwie teraz to zrozumiałem. Nigdy nie przyszło mi do głowy. Jest więc tylko jeden sposób - myślę, że dodać go dynamicznie. Lub przekazanie nazwy modelu jako ciągu. Dzięki za twoją odpowiedź!
— user3677173

18
Gorąco polecam Madge do debugowania tego rodzaju problemów w bardziej złożonych przypadkach (tj. Z większą liczbą plików). Po zainstalowaniu możesz użyć go madge -c <app entry point>do wykrycia wszelkich zależności cyklicznych.
— schu34

7
Dzięki. Dość bolesne, że nawet nie zgłasza błędu, ale po prostu zwraca pusty obiekt.
— Robert Oschler
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.