termine - ¿Cómo encontrar qué promesas no se manejan en Node.js UnhandledPromiseRejectionWarning?
promesas typescript (3)
Node.js de la versión 7 tiene azúcar sintáctico asíncrono / en espera para manejar las promesas y ahora en mi código aparece la siguiente advertencia con bastante frecuencia:
(node:11057) UnhandledPromiseRejectionWarning: Unhandled promise
rejection (rejection id: 1): ReferenceError: Error: Can''t set headers
after they are sent.
(node:11057) DeprecationWarning: Unhandled promise rejections are
deprecated. In the future, promise rejections that are not handled
will terminate the Node.js process with a non-zero exit code.
Desafortunadamente no hay referencia a la línea donde falta la captura. ¿Hay alguna forma de encontrarlo sin verificar cada bloque try / catch?
La forma
correcta
de mostrar un seguimiento completo de la pila para los rechazos de Promesas ES6 no controladas es ejecutar Node.js con el
--trace-warnings
.
Esto mostrará el seguimiento completo de la pila para cada advertencia, sin tener que interceptar el rechazo desde su propio código.
Por ejemplo:
node --trace-warnings app.js
¡Asegúrese de que el indicador de
trace-warnings
antes
del nombre de su archivo
.js
!
De lo contrario, el indicador se interpretará como un argumento para su secuencia de comandos, y el propio Node.js lo ignorará.
Si realmente desea
manejar los
rechazos no controlados (por ejemplo, registrándolos), puede utilizar mi módulo de
unhandled-rejection
, que captura todos los rechazos no controlados para cada implementación de Promesas importante que lo admita, con un solo controlador de eventos.
Ese módulo es compatible con Bluebird, ES6 Promises, Q, WhenJS,
es6-promise
,
then/promise
, y cualquier cosa que se ajuste a cualquiera de las especificaciones de rechazo no manejadas (detalles completos en la documentación).
Registro con seguimiento de pila
Si está buscando más de un mensaje de error útil. Intente agregar esto a su archivo de nodo. Debería mostrar el seguimiento de la pila completa donde está ocurriendo su bloqueo.
process.on(''unhandledRejection'', (error, p) => {
console.log(''=== UNHANDLED REJECTION ==='');
console.dir(error.stack);
});
escuchar evento de docs del proceso.
process.on(''unhandledRejection'', (reason, p) => {
console.log(''Unhandled Rejection at: Promise'', p, ''reason:'', reason);
// application specific logging, throwing an error, or other logic here
});