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


¿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.


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.


¿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í

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.