Wie debugge ich Versprechen-basierten Code in Knoten?

7

Ich benutze Cujos großartige Wenn Bibliothek eine Promises / A + Implementierung für mein Node Projekt zur Verfügung stellt, obwohl diese Frage nicht knotenspezifisch ist.

Im Allgemeinen, wenn es großartig ist: es lässt mich mehr wartbaren, lesbaren Code schreiben.

Wenn jedoch meine Callbacks unerwartet fehlschlagen (Zugriff auf eine Eigenschaft einer Null-Variablen usw.), werden die Ausnahmen effektiv von When geschluckt, wie es scheint spezifiziert durch die Promises / A + Spezifikation. Leider bedeutet dies, dass keine Rückmeldung über den Fehler erhält (abgesehen davon, dass der Callback zu diesem Zeitpunkt nicht mehr ausgeführt wird). Kein Fehlertyp oder Nachricht, keine Zeilennummer.

Zur Veranschaulichung:

%Vor%

Ich kann mir eine Handvoll (inakzeptabler) Wege vorstellen, dies anzugehen:

  • bietet Fehlerrückrufe für jeden then Aufruf (um den Grund / die Ausnahme an die Konsole auszugeben)
  • alle Callback-Körper in try-catches einschließen
  • die Codebase mit "Orientierungsprotokollen" versehen ala console.log('I got here 123')

Mache ich es einfach falsch? Sicherlich bin ich nicht allein darin, die Debuggabilität von auf Versprechen basierenden Codes schlecht zu finden. Gibt es eine offensichtliche Lösung, die ich vermisse?

    
aaaidan 08.01.2014, 08:58
quelle

2 Antworten

15

Update Sep 2016: NodeJS 6.6.0+ und 7.0+ warnen automatisch bei unbehandelten Ablehnungen. Führen Sie den Knoten mit --trace-warnings aus, um sinnvolle Stack-Traces zu erhalten. Immer noch nicht so gut wie das, was dir der Bluebird bietet, aber viel besser als vorher.

Ok, also fasse die Informationen aus den Kommentaren zusammen und füge etwas hinzu.

  • Es gibt nichts in der Spezifikation von Promises / A +, die vorschreibt, wie mit diesem Problem umzugehen ist. In der Spezifikation geht es um die minimalen Anforderungen für eine gute Interop zwischen verschiedenen Versprechen Bibliotheken - so eine Versprechen-Bibliothek kann Versprechen in einem anderen und umgekehrt konsumiert konsumieren.
  • Mehrere Bibliotheken lösen dieses Problem, indem sie eine .done -Methode einfügen, die explizit angibt, dass die Kette beendet wurde. Dies führt dazu, dass nicht erfasste Ablehnungen ausgelöst werden. Bibliotheken wie When und Q lösen das Problem auf diese Weise. Zum Beispiel, wenn Ihr .then nach .query ein .done wäre, würden Sie einen langen Stack-Trace bekommen.
  • Neuere, weniger naive Implementierungen von Versprechungen wie Bluebird lösen dieses Problem, indem sie automatisch möglicherweise nicht abgefangene Ablehnungen herausfinden und sie für Sie laut abmelden. Sie geben dir auch einen Haken. Wann hat experimentelle Unterstützung dafür mit dem Monitor.

Als solche:

%Vor%

Mit bluebird

%Vor%
    ES6 Versprechungen 'Verhalten ist hier nicht spezifiziert. Es gibt keine expliziten Anforderungen an die nativen Implementierungen in diesem Zusammenhang. Ich weiß jedoch, dass die Anbieter daran arbeiten, und ich erwarte, dass die Suchmaschinen dies auch in nativen Implementierungen herausfinden.
Benjamin Gruenbaum 13.04.2014, 12:33
quelle
9

Hier erfasse ich, wenn ein Promise auf Knoten abgelehnt, aber nicht abgefangen wurde:

%Vor%

Zusätzlich können Sie diesen Affen-Wrapper verwenden, um lange Stack-Traces für Nodes ES6 Promises bereitzustellen . Es erzeugt eine ähnliche Ausgabe wie Q longStackSupport . Ich würde es aufgrund von Leistungsbedenken nicht zur Verwendung außerhalb des Entwicklungscodes empfehlen. (Es funktioniert für mich in Node v4.4.1. Ich habe es noch nicht in Chrome oder Firefox getestet.)

    
joeytwiddle 19.04.2016 04:08
quelle