Require gibt ein leeres Objekt zurück


124

Ich habe einen Ordner mit index.js und einigen Modellen (Klassen) 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

Das Problem ist, dass die Autorenklasse das Buch nicht zu finden scheint! Es ist nur ein leeres Objekt. Wenn ich jedoch die Exporte in index.js wechsle und Buch nach Autor setze, funktioniert es, aber dann funktioniert das andere Modell nicht mehr.

Ich möchte keine Hacks machen, damit es funktioniert.


4
Author.js benötigt Book.js zum Ausführen und Book.js benötigt Author.js zum Ausführen? Entfernen Sie die zirkuläre Abhängigkeit.
Philipp Gayret

1
Welches ActiveRecord-Objekt ist das? Wo kommt es her?
BT

Antworten:


205

Dies liegt daran, dass Sie eine zirkuläre Abhängigkeit haben. Node.js behandelt dies auf ganz bestimmte Weise:

  1. Das erste Modul wird geladen und ausgeführt (in diesem Fall book.js). It ( book.js) lädt das zweite Modul ( author.js) und führt es aus, wenn es book.jsdas andere ( author.js) benötigt ( )

  2. Wenn das zweite Modul ( author.js) geladen und ausgeführt wird, benötigt es ( author.js) das erste Modul ( book.js), aber es ( author.js) empfängt ein teilweise gefülltes Objekt - es wurden jedoch viele Dinge für die Exporte in book.js festgelegt, bevor es author.js erforderlich machte in diesem Objekt sein

  3. Nachdem book.jses vollständig durchlaufen wurde, ist das Objekt, author.jsvon dem require('./book')es stammt, das vollständige book.jsModulobjekt

Weitere Informationen finden Sie in den folgenden Dokumenten: http://nodejs.org/api/modules.html

Wenn es möglich ist, dieses Schema dynamisch zu einem dieser ActiveRecord-Objekte hinzuzufügen, ist dies eine Möglichkeit, dies zu lösen. Dies ist eigentlich eine schwierige Situation. Selbst ohne das Modulsystem würde dies Probleme für Sie verursachen. Wenn Sie all diesen Code in eine Datei einfügen, wie würden Sie ihn zum Laufen bringen?


1
Ich weiß, dass Sie nicht alles in eine Datei packen sollten, aber ich sage, experimentieren Sie einfach so. Mein Punkt dort ist, dass es nicht das Modulsystem von node.js ist, das das Problem hier verursacht, sondern der Code selbst.
BT

Tatsächlich hat Java die gleichen Probleme mit zirkuklaren Abhängigkeiten - ein Problem, das jede Sprache haben kann. Wenn Sie lediglich einen Verweis auf Ihren Partner für zirkuläre Abhängigkeiten benötigen, kann Javascript dies genauso einfach tun wie Java. Hier versuchen Sie jedoch, das Objekt zu verwenden, bevor es (in der Erweiterung) erstellt wurde
BT

Ja, eigentlich habe ich es jetzt verstanden. Mir ist nie in den Sinn gekommen. Es gibt also nur einen Weg - es dynamisch hinzuzufügen, denke ich. Oder einen Modellnamen als Zeichenfolge übergeben. Vielen Dank für Ihre Antwort!
user3677173

18
Ich empfehle Madge sehr, um diese Art von Problemen in komplexeren Fällen (dh mit mehr Dateien) zu debuggen. Nach der Installation können Sie madge -c <app entry point>zirkuläre Abhängigkeiten erkennen.
schu34

7
Vielen Dank. Ziemlich schmerzhaft, dass es nicht einmal einen Fehler auslöst, sondern nur ein leeres Objekt zurückgibt.
Robert Oschler
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.