Trovare la fonte del rifiuto della promessa non gestita: TypeError: rilevato il ciclo di concatenazione per la promessa


11

Sto cercando di trovare l'origine di un rifiuto non gestito da una Promessa in Node.js

Ho provato ad aggiornare alla versione 12 del nodo, usando l' --async-stack-tracesopzione e ascoltandoli usando:

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

Ma ancora non vedo alcuna traccia dello stack utile per aiutarmi a trovare il colpevole!

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)

Esecuzione del nodo v10.10.0


Ci sono più promesse?
Prabhjot Singh Kainth,

4
L'errore nel tuo codice è un concatenamento ciclico, come avresti fatto con te const cyclic = Promise.resolve().then(()=>cyclic);, quindi non cercare un rifiuto promesso non gestito, questo è nel codice interno del nodo.
Kaiido

1
Qualche codice che solleva il problema sarebbe utile.
x00

l'esecuzione npm i bluebirde l'aggiunta const Promise = require('bluebird')al codice possono fornire un messaggio di errore più dettagliato
n3ko,

prova a eseguire il nodo con --trace-warnings, i rifiuti non gestiti sono accompagnati da avvisi che puoi rintracciare
Karen Grigoryan,

Risposte:


2

Se perdi un utile stacktrace, puoi fare in modo che il nodo ne crei uno nuovo lanciando il tuo errore nel gestore in questo modo:

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

In questo modo, dovresti essere in grado di rintracciare il colpevole.


Provo di nuovo dalla mia parte e sicuramente funziona.
Gomino,

@d -_- b sei stato in grado di testarlo dalla tua parte?
Gomino

Ciao @Gomino, sì purtroppo non ha funzionato nel mio scenario ma apprezzo il tuo aiuto qui!
d -_- b

0

Grazie per tutti i suggerimenti. Ho provato ancora una volta aggiornando all'ultimo Nodo 12.14.1ed è stato finalmente in grado di farlo mostrare lo stack trace:

Ho usato node --async-stack-traces myScript.jsinsieme a:

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

E ha rintracciato l'errore.


Il nodo 12 non registra il motivo del rifiuto non gestito anche senza quel gestore eventi?
Bergi,

Non hai nemmeno provato la soluzione che ti ho fornito?
Gomino,

-1

Per trovare una buona traccia dello stack per questo codice const cyclic = Promise.resolve().then(() => cyclic); ho inserito questo codice nel file prromise_cycle.jsed eseguito con inspector per eseguirne il debug.

Lo debug su Chrome DevTools con flag Pause on caught exceptionsabilitato, e quindi posso vedere l'intera traccia dello stack con il mio file su di esso

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.