Recherche d'une source de rejet de promesse non gérée: TypeError: cycle de chaînage détecté pour la promesse


11

J'essaie de trouver la source d'un rejet non géré d'une promesse dans Node.js

J'ai essayé de mettre à niveau vers Node version 12, en utilisant l' --async-stack-tracesoption, et en les écoutant en utilisant:

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

Mais je ne vois toujours aucune trace de pile utile pour m'aider à trouver le coupable!

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)

Exécution de Node v10.10.0


Y a-t-il plusieurs promesses?
Prabhjot Singh Kainth

4
L'erreur dans votre code est un chaînage cyclique, comme vous le feriez avec const cyclic = Promise.resolve().then(()=>cyclic);, alors ne recherchez pas un rejet de promesse non géré, celui-ci est dans le code interne du nœud.
Kaiido

1
Un code augmentant le problème serait utile.
x00

l'exécution npm i bluebirdet l'ajout const Promise = require('bluebird')au code peuvent vous donner un message d'erreur plus détaillé
n3ko

essayez d'exécuter le nœud avec --trace-warnings, les rejets non gérés sont accompagnés d'avertissements que vous pouvez suivre
Karen Grigoryan

Réponses:


2

Si vous manquez une trace de pile utile, vous pouvez faire en sorte que le nœud en crée une nouvelle en renvoyant votre erreur dans votre gestionnaire comme ceci:

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

De cette façon, vous devriez être en mesure de retrouver le coupable.


J'essaye juste de nouveau de mon côté, et ça marche vraiment.
Gomino

@d -_- b avez-vous pu tester cela de votre côté?
Gomino

Salut @ Gomino, oui malheureusement cela n'a pas fonctionné dans mon scénario mais j'apprécie votre aide ici!
d -_- b

0

merci pour toutes les suggestions. J'ai essayé une fois de plus en effectuant une mise à niveau vers le dernier nœud 12.14.1et j'ai finalement réussi à obtenir la trace de la pile:

J'ai utilisé node --async-stack-traces myScript.jsen conjonction avec:

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

Et il a retrouvé l'erreur.


Le nœud 12 n'enregistre-t-il pas la raison du rejet non géré même sans ce gestionnaire d'événements?
Bergi

N'avez-vous même pas essayé la solution que j'ai fournie?
Gomino

-1

Pour trouver une bonne trace de pile pour ce code, const cyclic = Promise.resolve().then(() => cyclic); j'ai mis ce code dans le fichier prromise_cycle.jset exécuté avec l'inspecteur pour le déboguer.

Je le débogue sur Chrome DevTools avec le drapeau Pause on caught exceptionsactivé, puis je peux voir toute la trace de la pile avec mon fichier dessus

entrez la description de l'image ici

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.