web-dev-qa-db-ja.com

どの約束がNode.jsのUnhandledPromiseRejectionWarningで未処理であるかを見つける方法は?

バージョン7のNode.jsには、約束を処理するためのasync/await構文シュガーがあり、私のコードでは次のような警告が頻繁に発生します。

(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.

残念ながら、キャッチが欠けている行への参照はありません。すべてのtry/catchブロックをチェックせずにそれを見つける方法はありますか?

140
user1658162

listen unhandledRejection プロセスのイベント。

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

未処理のES6 Promise拒否に対する完全なスタックトレースを表示する correct の方法は、--trace-warningsフラグを付けてNode.jsを実行することです。これはあなた自身のコードの中から拒絶を傍受する必要なしに、あらゆる警告に対する完全なスタックトレースを表示します。例えば:

 node --trace-warnings app.js 

trace-warningsフラグが の前に来ることを確認してください あなたの.jsファイルの名前!それ以外の場合、フラグはスクリプトの引数として解釈され、Node.js自体によって無視されます。

実際に handle 未処理の拒否をしたい場合(例えばそれらをログに記録することによって)、代わりにmy unhandled-rejection モジュールを使用することをお勧めします。単一のイベントハンドラで.

このモジュールは、Bluebird、ES6 Promises、Q、WhenJS、es6-promisethen/promise、および未処理の拒否仕様のいずれかに準拠したもの(ドキュメントの全詳細)をサポートしています。

59
Sven Slootweg

スタックトレースによるロギング

もっと役に立つエラーメッセージを探しているなら。これをあなたのノードファイルに追加してみてください。クラッシュが発生している場所のフルスタックトレースが表示されます。

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