usando tutorial preguntamos por objetos nodos manipular manejo los hijos elemento cómo con actualizar javascript node.js debugging promise

javascript - tutorial - ¿Cómo depuro el código basado en promesas en el nodo?



mozilla javascript dom reference (2)

Así es como detecto cuándo una Promesa ha sido rechazada en el Nodo pero no atrapada:

if (typeof process === ''object'') { process.on(''unhandledRejection'', (error, promise) => { console.error("== Node detected an unhandled rejection! =="); console.error(error.stack); }); }

Además de eso, puedes usar esta envoltura de mono para proporcionar rastros de pila largos para Nodo''s ES6 Promises . Produce un resultado similar al longStackSupport de longStackSupport No lo recomendaría para su uso fuera del código de desarrollo, debido a problemas de rendimiento. (Funciona para mí en el nodo v4.4.1. Todavía no lo he probado en Chrome o Firefox).

Estoy usando la gran biblioteca When de Cujo para proporcionar una implementación Promises / A + para mi proyecto Node, aunque esta pregunta no es específica del nodo.

En general, cuando es genial: me permite escribir un código más legible y fácil de mantener.

Sin embargo, cuando mis devoluciones de llamada fallan de forma inesperada (accediendo a una propiedad de una variable nula, etc.), las excepciones son tragadas efectivamente por Cuando, como parece estar especificado por la especificación Promises / A +. Desafortunadamente, esto significa que no recibo ningún comentario sobre el error (salvo que la devolución de llamada deja de ejecutarse en ese punto). Sin tipo de error o mensaje, sin número de línea.

Para ilustrar:

// hypothetical asynchronous database query database.query(queryDetails).then(function(result) { var silly = 3.141592654; silly(); // TypeError: number is not a function! process(result); // this code is silently never executed });

Puedo pensar en un puñado de formas (inaceptables) de abordar esto:

  • proporcionando devoluciones de llamadas por fallas para cada llamada en then (para volcar el motivo / excepción a la consola)
  • envolviendo todos los cuerpos de devolución de llamada en intentos de captura
  • ensuciar la base de código con "registros históricos" ala console.log(''I got here 123'')

¿Lo estoy haciendo mal? Seguramente no estoy solo al encontrar que la depuración del código basado en promesas es pobre. ¿Hay una solución obvia que me falta?


Actualización de septiembre de 2016: NodeJS 6.6.0+ y 7.0+ advertirán automáticamente sobre los rechazos no controlados. Ejecutar nodo con --trace-warnings para obtener rastreos de pila razonables. Todavía no es tan bueno como lo que bluebird te da pero mucho mejor que la situación anterior.

Ok, resumiendo la información de los comentarios y agregando algunos.

  • No hay nada en la especificación Promises / A + que dicte cómo tratar este problema. La especificación trata sobre los requisitos mínimos para una buena interoperabilidad entre diferentes bibliotecas de promesas, de modo que una biblioteca de promesas puede consumir promesas creadas en otro y viceversa.
  • Varias bibliotecas resuelven este problema al incluir un método .done que declara explícitamente que la cadena ha finalizado, esto provoca que se rechacen rechazos no detectados. Bibliotecas como When y Q resuelven el problema de esta manera. Por ejemplo, si tu .then después de .query fue un .done , obtendrías un seguimiento de pila largo.
  • Implementaciones de promesas más nuevas y menos ingenuas como Bluebird resuelven este problema al descubrir automáticamente posibles rechazos no detectados y al iniciar sesión para usted en voz alta. También te dan un gancho. Cuando tiene soporte experimental para esto usando el monitor.

Como tal:

require(''when/monitor/console''); // when will now log async rejections used with // `then` , this is experimental in when.

Con bluebird

Promise.longStackTraces(); // Bluebird always logs async rejections but with this // option it will stitch the asynchronous context stack // for you in your methods.

  • El comportamiento de las promesas de ES6 no está especificado en esto. No hay requisitos explícitos sobre las implementaciones nativas con respecto a esto. Sin embargo, sé que los proveedores están trabajando en ello y espero que los motores comiencen a descifrar esto incluso en implementaciones nativas.