Localizando fonte de rejeição de promessa não tratada: TypeError: Ciclo de encadeamento detectado para promessa

11

Estou tentando encontrar a fonte de uma rejeição não tratada de uma promessa no Node.js

Tentei atualizar para o Node versão 12, usando a --async-stack-tracesopção e ouvindo-os usando:

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

Mas ainda não vejo nenhum rastreamento útil da pilha para me ajudar a encontrar o culpado!

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)

Executando o Nó v10.10.0

d -_- b
fonte
Existem várias promessas?
Prabhjot Singh Kainth
4
O erro no seu código é um encadeamento cíclico, como você faria com const cyclic = Promise.resolve().then(()=>cyclic);, portanto, não procure por uma rejeição de promessa não tratada, essa é no código interno do nó.
Kaiido 8/01
11
Algum código levantando a questão seria útil.
x00 9/01
executar npm i bluebirde adicionar const Promise = require('bluebird')ao código pode fornecer uma mensagem de erro mais detalhada
n3ko 10/01
tente executar o nó com --trace-warnings, rejeições não tratadas são acompanhadas de avisos que você pode rastrear
Karen Grigoryan

Respostas:

2

Se você perder um rastreamento de pilha útil, poderá fazer o nó criar um novo, lançando novamente seu erro no manipulador da seguinte maneira:

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

Dessa forma, você deve ser capaz de rastrear o culpado.

Gomino
fonte
Eu apenas tento novamente do meu lado, e definitivamente funciona.
Gomino 13/01
@d -_- b você conseguiu testar isso do seu lado?
Gomino 14/01
Oi @Gomino, sim, infelizmente não funcionou no meu cenário, mas agradeço a sua ajuda aqui!
d -_- b 16/01
0

Obrigado por todas as sugestões. Tentei mais uma vez atualizando para o nó mais recente 12.14.1e finalmente consegui mostrar o rastreamento da pilha:

Eu usei node --async-stack-traces myScript.jsem conjunto com:

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

E localizou o erro.

d -_- b
fonte
O nó 12 não registra o motivo da rejeição não tratada, mesmo sem esse manipulador de eventos?
Bergi 15/01
Você nem tentou a solução que eu forneci?
Gomino
-1

Para encontrar um bom rastreamento de pilha para esse código const cyclic = Promise.resolve().then(() => cyclic); , coloquei esse código no arquivo prromise_cycle.jse executei com o inspector para depurá-lo.

Eu depuro no Chrome DevTools com sinalizador Pause on caught exceptions ativado e, em seguida, consigo ver todo o rastreamento da pilha com o meu arquivo

insira a descrição da imagem aqui

Łukasz Szewczak
fonte