Node.js de la version 7 a du sucre syntaxique async / await pour gérer les promesses et maintenant, dans mon code, l'avertissement suivant apparaît assez souvent:
(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.
Malheureusement, il n'y a aucune référence à la ligne où la capture est manquante. Existe-t-il un moyen de le trouver sans vérifier chaque bloc try / catch?
node.js
promise
async-await
warnings
unhandled-exception
user1658162
la source
la source
unhandledRejection
événement de Node vous aidera? Consultez la documentation . Votre rappel obtient l'Error
objet et le réelPromise
, et je pense que l'Error
objet peut contenir une trace de pile.Can't set headers after they are sent.
devrait vous donner une idée de l'endroit où cela pourrait se produire dans votre code (c'est-à-dire quelque part où vous définissez des en-têtes après que les en-têtes auraient déjà été envoyés - probablement à cause d'une mauvaise compréhension du code asynchrone , mais c'est une supposition)Réponses:
écouter l'
unhandledRejection
événement du processus.la source
error.stack
(ou dans l'exemple ci-dessusreason.stack
) vous donne la trace complète de la pile de l'erreur.app.js
fichier de nœud et rien n'est malheureusement enregistré. Nodev10.13.0
.La manière correcte d'afficher une trace de pile complète pour les rejets de promesse ES6 non gérés consiste à exécuter Node.js avec l'
--trace-warnings
indicateur. Cela affichera le stacktrace complet pour chaque avertissement, sans avoir à intercepter le rejet depuis votre propre code. Par exemple:Assurez-vous que l'
trace-warnings
indicateur précède le nom de votre.js
fichier! Sinon, l'indicateur sera interprété comme un argument de votre script, et il sera ignoré par Node.js lui-même.Si vous voulez réellement gérer les rejets non gérés (par exemple en les journalisant), vous pouvez utiliser mon
unhandled-rejection
module à la place, qui intercepte tous les rejets non gérés pour chaque implémentation majeure de Promises qui le prend en charge, avec un seul gestionnaire d'événements.Ce module supports Bluebird, Promesses ES6, Q, WhenJS,
es6-promise
,then/promise
et tout ce qui est conforme à l' une des spécifications de rejet (non gérées détails complets dans la documentation).la source
package.json
démarrer le script et rien n'a été enregistré malheureusement. Nodev10.13.0
.Journalisation avec trace de pile
Si vous recherchez plus d'un message d'erreur utile. Essayez de l'ajouter à votre fichier de nœud. Il devrait afficher la trace complète de la pile où votre crash se produit.
la source