web-dev-qa-db-fra.com

Comment savoir quelles promesses ne sont pas gérées dans Node.js UnhandledPromiseRejectionWarning?

Node.js de la version 7 a un sucre syntaxique async/wait pour la gestion des 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. Est-il possible de le trouver sans vérifier chaque bloc try/catch?

157
user1658162

listen unhandledRejection événement du processus.

process.on('unhandledRejection', (reason, p) => {
  console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
  // application specific logging, throwing an error, or other logic here
});
265
cuixiping

La manière correcte d'afficher un tracé de pile complet pour les rejets de promesse ES6 non gérées, consiste à exécuter Node.js avec le drapeau _--trace-warnings_. Cela montrera le stacktrace complet pour chaque avertissement, sans avoir à intercepter le rejet de votre propre code. Par exemple:

 noeud --trace-warnings app.js 

Assurez-vous que l'indicateur _trace-warnings_ est précédé avant du nom de votre fichier _.js_! Sinon, le drapeau sera interprété comme un argument de votre script et 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 enregistrant), vous pouvez utiliser mon unhandled-rejection module à la place, qui récupère tous les rejets non gérés de chaque implémentation Promises majeure qui le prend en charge, avec un seul gestionnaire d’événements.

Ce module prend en charge Bluebird, ES6 Promises, Q, WhenJS, _es6-promise_, _then/promise_ et tout ce qui est conforme aux spécifications de rejet non gérées (détails complets dans la documentation).

65
Sven Slootweg

Journalisation avec trace de pile

Si vous recherchez plus d'un message d'erreur utile. Essayez d'ajouter ceci à votre fichier de noeud. Il devrait afficher la trace de pile complète où votre crash se produit.

process.on('unhandledRejection', (error, p) => {
  console.log('=== UNHANDLED REJECTION ===');
  console.dir(error.stack);
});
2
joshuakcockrell