Node.js aus Version 7 hat asynchronen / wartenden syntaktischen Zucker für den Umgang mit Versprechungen, und jetzt wird in meinem Code häufig die folgende Warnung angezeigt:
(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.
Leider gibt es keinen Hinweis auf die Linie, in der der Fang fehlt. Gibt es eine Möglichkeit, es zu finden, ohne jeden Try / Catch-Block zu überprüfen?
node.js
promise
async-await
warnings
unhandled-exception
user1658162
quelle
quelle
unhandledRejection
hilft die Registrierung bei Node ? Siehe die Dokumente . Ihr Rückruf erhält dasError
Objekt und das tatsächlichePromise
, und ich glaube, dasError
Objekt könnte eine Stapelverfolgung enthalten.Can't set headers after they are sent.
sollten Sie einen Hinweis darauf erhalten, wo in Ihrem Code dies passieren könnte (dh irgendwo setzen Sie Header, nachdem die Header bereits gesendet worden wären - vermutlich aufgrund eines Mangels an Verständnis für asynchronen Code , aber das ist eine Vermutung)Antworten:
unhandledRejection
Prozessereignis anhören .quelle
error.stack
(oder im obigen Beispielreason.stack
) erhalten Sie die vollständige Stapelverfolgung des Fehlers.process.on
und nichtserver.on
wie in so vielen anderen Beispielen, die ich gefunden habeapp.js
und leider wird nichts protokolliert. Knotenv10.13.0
.Der richtige Weg, um eine vollständige Stapelverfolgung für nicht behandelte ES6-Promise-Ablehnungen anzuzeigen, besteht darin, Node.js mit dem
--trace-warnings
Flag auszuführen . Dies zeigt die vollständige Stapelverfolgung für jede Warnung an, ohne dass die Ablehnung aus Ihrem eigenen Code heraus abgefangen werden muss. Beispielsweise:Stellen Sie sicher, dass das
trace-warnings
Flag vor dem Namen Ihrer.js
Datei steht! Andernfalls wird das Flag als Argument für Ihr Skript interpretiert und von Node.js selbst ignoriert.Wenn Sie nicht behandelte Ablehnungen tatsächlich verarbeiten möchten (z. B. indem Sie sie protokollieren), möchten Sie möglicherweise
unhandled-rejection
stattdessen mein Modul verwenden, das alle nicht behandelten Ablehnungen für jede wichtige Promises-Implementierung, die dies unterstützt, mit einem einzigen Ereignishandler abfängt.Dieses Modul unterstützt Bläuling, ES6 Promises, Q, WhenJS,
es6-promise
,then/promise
und alles , was das entspricht jedes der nicht behandelte Ablehnung Spezifikationen (Einzelheiten in der Dokumentation).quelle
package.json
um das Skript zu starten, und leider wurde nichts protokolliert. Knotenv10.13.0
.Protokollierung mit Stack-Trace
Wenn Sie nach einer hilfreichen Fehlermeldung suchen. Versuchen Sie, dies zu Ihrer Knotendatei hinzuzufügen. Es sollte die vollständige Stapelverfolgung anzeigen, in der Ihr Absturz stattfindet.
quelle