Ich bekomme dieses Problem immer in Node, wo meine Anwendung abstürzt, wenn ich Funktionen von einander aufrufe.
Ich habe dieses minimale Arbeitsbeispiel gemacht (funktioniert so wie es mir den Fehler gibt):
Modul starten
%Vor%Modul2
%Vor%Modul3
%Vor%Der Fehler, den ich bekomme, ist:
%Vor% Das start module
ruft eine Funktion in module2
auf, die letztendlich eine Funktion in module3
aufruft, die ihrerseits eine Funktion in module2
aufruft.
Alle Module werden ordnungsgemäß benötigt und finden die erste Methode in module2
einfach in Ordnung.
Was passiert hier und wie würde man über dieses Muster gehen, wenn man eine Funktion von dem Modul bekommen muss, mit dem man kam?
BEARBEITEN
Das Debugging zeigt mir, dass das Modul existiert, aber es ist leer abgesehen von dem Prototyp, den es hat. Meine Frage ist warum? Innerhalb von Node / JavaScript, was passiert hier?
Sie haben eine zirkuläre Referenz, Modul 2 hängt von Modul 3 ab, das von Modul 2 abhängt, das von Modul 3 abhängt (und so weiter). Beim Versuch, module 3
für module 2
aufzulösen, kann es nicht abgeschlossen werden, weil module 3
selbst zuerst aufgelöst werden muss.
Von Ссылка :
Wenn zirkuläre require () -Aufrufe vorhanden sind, hat ein Modul möglicherweise keine beendet die Ausführung, wenn sie zurückgegeben wird.
Um eine Endlosschleife zu verhindern, wird eine unfertige Kopie der a.js Das exports-Objekt wird an das b.js-Modul zurückgegeben.
Das Modul ist also verfügbar, aber unvollständig (was erklärt, dass Sie nur einen Prototyp erhalten). Zirkuläre Referenzen sind sowieso ein Code-Geruch, versuche es zu vermeiden:)
Wenn Sie jedoch Modul 2 und 3 als eine Abhängigkeit in Ihrem Startmodul verwenden, sollte es trotzdem funktionieren.
%Vor%Dieses Problem hier kann leicht behoben werden, während die Struktur Ihrer App beibehalten wird (was in Bezug auf zirkuläre Referenzen in Ordnung ist).
Sie müssen nur das Standardobjekt exports
beibehalten, das vom System an Ihre Module übergeben wird. Ändern Sie es nicht mit module.exports = {...}
.
Folgendes sollte funktionieren:
Ich werde versuchen zu erklären, was aus der ersten Zeile Ihres Ausgangspunktes passiert:
module.exports = {...}
module.exports = {...}
Das Problem tritt hier zwischen den Punkten 3 und 6 auf. Module3 empfängt die Exporte von Modul2 (3), bevor Sie die Referenz darauf ändern (6).
Die Verwendung von exports.method = ...
löst das Problem, da sich das exports-Objekt nie ändert.
Tags und Links javascript node.js typeerror