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

d -_- b
źródło
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ę.

Gomino
źródło
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.

d -_- b
źródło
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

Łukasz Szewczak
źródło