'TypeError: undefined ist keine Funktion, wenn' zwischen Modulen gesprungen wird

8

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?

    
Gemtastic 03.08.2015, 09:09
quelle

2 Antworten

4

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%     
Justus Romijn 03.08.2015, 09:12
quelle
6

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:

Modul starten

%Vor%

Modul 2

%Vor%

Modul 3

%Vor%

Erklärung

Ich werde versuchen zu erklären, was aus der ersten Zeile Ihres Ausgangspunktes passiert:

  1. In start.js benötigen Sie modul2 und es ist noch nicht geladen: der Code von module2.js wird ausgeführt
  2. In module2.js benötigen Sie modul3 und es ist noch nicht geladen: Der Code von module3.js wird ausgeführt
  3. In module3.js benötigen Sie modul2, und es ist bereits geladen: Die Variable module2 enthält jetzt das exports-Objekt von module2.
  4. Der Rest von modul3 wird ausgeführt und Sie ändern sein Export-Objekt mit module.exports = {...}
  5. In module2.js enthält die Variable module3 jetzt das exports-Objekt von module3.
  6. Der Rest von module2.js wird ausgeführt und Sie ändern sein Export-Objekt mit module.exports = {...}
  7. In start.js enthält die Variable module2 jetzt das exports-Objekt von module2.

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.

    
Targos 03.08.2015 11:12
quelle

Tags und Links