Finden der Quelle für die Ablehnung nicht behandelter Versprechen: TypeError: Verkettungszyklus für Versprechen erkannt


11

Ich versuche, die Quelle einer unbehandelten Ablehnung eines Versprechens in Node.js zu finden

Ich habe versucht, mit der --async-stack-tracesOption auf Node Version 12 zu aktualisieren und sie mit folgenden Funktionen abzuhören:

process.on("unhandledRejection",( reason, promise ) => {
  console.log(reason);
  console.log(promise);
});

Aber ich sehe immer noch keine hilfreiche Stapelspur, die mir hilft, den Schuldigen zu finden!

UnhandledPromiseRejectionWarning: TypeError: Chaining cycle detected for promise #<Promise>
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:89675) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 11)

Ausführen von Node v10.10.0


Gibt es mehrere Versprechen?
Prabhjot Singh Kainth

4
Der Fehler in Ihrem Code ist eine zyklische Verkettung, wie Sie es bei hätten. const cyclic = Promise.resolve().then(()=>cyclic);Suchen Sie also nicht nach einer unbehandelten Ablehnung von Versprechungen, diese befindet sich im internen Code des Knotens.
Kaiido

1
Ein Code, der das Problem aufwirft, wäre hilfreich.
x00

Das Ausführen npm i bluebirdund Hinzufügen const Promise = require('bluebird')des Codes kann zu einer detaillierteren Fehlermeldung führen
n3ko

--trace-warningsWenn Sie versuchen, einen Knoten mit nicht behandelten Ablehnungen auszuführen, werden Warnungen angezeigt, die Sie verfolgen können
Karen Grigoryan,

Antworten:


2

Wenn Sie eine hilfreiche Stapelverfolgung verpassen, können Sie den Knoten dazu bringen, eine neue zu erstellen, indem Sie Ihren Fehler wie folgt erneut in Ihren Handler werfen:

process.on('unhandledRejection', (reason, p) => { throw reason });

Auf diese Weise sollten Sie in der Lage sein, den Täter aufzuspüren.


Ich versuche es einfach noch einmal auf meiner Seite und es funktioniert definitiv.
Gomino

@d -_- b Konnten Sie dies auf Ihrer Seite testen?
Gomino

Hallo @Gomino, ja leider hat es in meinem Szenario nicht funktioniert, aber ich schätze deine Hilfe hier!
d -_- b

0

danke für alle vorschläge. Ich habe es noch einmal versucht, indem ich auf den neuesten Knoten aktualisiert habe, 12.14.1und konnte ihn schließlich dazu bringen, den Stack-Trace anzuzeigen:

Ich habe node --async-stack-traces myScript.jsin Verbindung mit verwendet:

process.on('unhandledRejection', (reason, p) => {
  console.log(reason);
});

Und es hat den Fehler aufgespürt.


Protokolliert Knoten 12 den nicht behandelten Ablehnungsgrund nicht auch ohne diesen Ereignishandler?
Bergi

Haben Sie nicht einmal die von mir bereitgestellte Lösung ausprobiert?
Gomino

-1

Um eine gute Stapelverfolgung für diesen Code zu finden, habe const cyclic = Promise.resolve().then(() => cyclic); ich diesen Code in die Datei eingefügt prromise_cycle.jsund mit dem Inspektor ausgeführt, um ihn zu debuggen.

Ich debugge es in Chrome DevTools mit Pause on caught exceptionsaktiviertem Flag und sehe dann den gesamten Stack-Trace mit meiner Datei darauf

Geben Sie hier die Bildbeschreibung ein

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.