Znalezienie źródła nieobsługiwanego odrzucenia obietnicy: TypeError: Wykryto cykl łączenia dla obietnicy


11

Próbuję znaleźć źródło nieobsługiwanego odrzucenia z obietnicy w Node.js

Próbowałem uaktualnić do Węzła w wersji 12, używając tej --async-stack-tracesopcji i nasłuchując, używając:

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

Ale nadal nie widzę żadnego pomocnego śladu stosu, który pomógłby mi znaleźć winowajcę!

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)

Uruchamianie węzła 10.10.0


Czy jest wiele obietnic?
Prabhjot Singh Kainth

4
Błąd w twoim kodzie to cykliczne tworzenie łańcuchów, tak jak byś to zrobił const cyclic = Promise.resolve().then(()=>cyclic);, więc nie szukaj nieobsługiwanego odrzucenia obietnicy, to jest w wewnętrznym kodzie węzła.
Kaiido

1
Przydałby się kod podnoszący problem.
x00

uruchomienie npm i bluebirdi dodanie const Promise = require('bluebird')do kodu może dać bardziej szczegółowy komunikat o błędzie
n3ko

spróbuj uruchomić węzeł --trace-warnings, nieobsługiwanym odrzuceniom towarzyszą ostrzeżenia, które możesz prześledzić
Karen Grigoryan

Odpowiedzi:


2

Jeśli pominiesz przydatne śledzenie stosu, możesz zmusić węzeł do utworzenia nowego, ponownie zgłaszając błąd w module obsługi:

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

W ten sposób powinieneś wytropić winowajcę.


Próbuję jeszcze raz po mojej stronie i to na pewno działa.
Gomino

@d -_- b czy byłeś w stanie to przetestować na swojej stronie?
Gomino

Cześć @Gomino, tak, niestety nie zadziałało w moim scenariuszu, ale doceniam twoją pomoc tutaj!
d -_- b

0

dzięki za wszystkie sugestie. Próbowałem jeszcze raz, uaktualniając do najnowszego węzła 12.14.1i wreszcie udało mi się go wyświetlić, aby wyświetlał ślad stosu:

Użyłem node --async-stack-traces myScript.jsw połączeniu z:

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

I wyśledził błąd.


Czy węzeł 12 nie rejestruje przyczyny nieobsługiwanego odrzucenia nawet bez tej procedury obsługi zdarzeń?
Bergi,

Nie wypróbowałeś nawet rozwiązania, które dostarczyłem?
Gomino

-1

Aby znaleźć dobre dane śledzenia stosu dla tego kodu const cyclic = Promise.resolve().then(() => cyclic); , umieszczam ten kod w pliku prromise_cycle.jsi uruchamiam z inspektorem, aby go debugować.

Debuguję go na Chrome DevTools z Pause on caught exceptionswłączoną flagą , a następnie widzę ślad całego stosu z moim plikiem na nim

wprowadź opis zdjęcia tutaj

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.