Encontrar la fuente del rechazo no prometido de la promesa: TypeError: ciclo de encadenamiento detectado para la promesa

11

Estoy tratando de encontrar la fuente de un rechazo no controlado de una Promesa en Node.js

Intenté actualizar a Nodo versión 12, usando la --async-stack-tracesopción, y escuchándolos usando:

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

¡Pero todavía no veo ningún rastro útil de la pila para ayudarme a encontrar al culpable!

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)

Ejecutando Nodo v10.10.0

d -_- b
fuente
¿Hay múltiples promesas?
Prabhjot Singh Kainth
44
El error en su código es un encadenamiento cíclico, como lo habría hecho con usted const cyclic = Promise.resolve().then(()=>cyclic);, así que no busque un rechazo de promesa no controlado, este está en el código interno del nodo.
Kaiido
1
Algún código que plantee el problema sería útil.
x00
ejecutar npm i bluebirdy agregar const Promise = require('bluebird')al código puede darle un mensaje de error más detallado
n3ko
intente ejecutar el nodo con --trace-warningsrechazos no controlados acompañados de advertencias que puede rastrear
Karen Grigoryan

Respuestas:

2

Si pierde un útil seguimiento de pila, puede hacer que el nodo cree uno nuevo volviendo a lanzar su error en su controlador de esta manera:

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

De esta manera, deberías poder localizar al culpable.

Gomino
fuente
Solo intento nuevamente de mi lado, y definitivamente funciona.
Gomino
@d -_- b ¿has podido probar esto de tu lado?
Gomino
Hola @Gomino, sí, lamentablemente no funcionó en mi escenario, ¡pero agradezco tu ayuda aquí!
d -_- b
0

Gracias por todas las sugerencias. Lo intenté una vez más actualizando al último nodo 12.14.1y finalmente pude conseguir que mostrara el seguimiento de la pila:

Solía node --async-stack-traces myScript.jsen conjunción con:

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

Y rastreó el error.

d -_- b
fuente
¿El nodo 12 no registra el motivo de rechazo no controlado incluso sin ese controlador de eventos?
Bergi
¿Ni siquiera has probado la solución que te he proporcionado?
Gomino
-1

Para encontrar un buen seguimiento de pila para este código const cyclic = Promise.resolve().then(() => cyclic); , pongo este código en el archivo prromise_cycle.jsy lo ejecuto con el inspector para depurarlo.

Lo depuro en Chrome DevTools con la marca Pause on caught exceptionshabilitada, y luego puedo ver todo el seguimiento de la pila con mi archivo

ingrese la descripción de la imagen aquí

Łukasz Szewczak
fuente