未処理のプロミス拒否のソースの検索:TypeError:プロミスの連鎖サイクルが検出されました


11

Node.jsでPromiseからの未処理の拒否の原因を見つけようとしています

--async-stack-tracesオプションを使用してノードバージョン12にアップグレードして、次の方法でそれらをリッスンしてみました。

process.on("unhandledRejection",( reason, promise ) => {
  console.log(reason);
  console.log(promise);
});

しかし、原因を見つけるのに役立つスタックトレースはまだ表示されません!

UnhandledPromiseRejectionWarning: TypeError: Chaining cycle detected for promise #<Promise>
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:89675) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 11)

ノードv10.10.0の実行


複数の約束がありますか?
Prabhjot Singh Kainth

4
中にエラーあなたのあなたが持っているだろうようなコードは、巡回連鎖であるconst cyclic = Promise.resolve().then(()=>cyclic);ので、未処理の約束拒否を検索しません、この1は、ノードの内部コードです。
海洋堂

1
問題を引き起こすいくつかのコードが役立つでしょう。
x00

コードを実行npm i bluebirdして追加const Promise = require('bluebird')すると、より詳細なエラーメッセージが表示される場合があります
n3ko

を使用してノードを実行しようとすると--trace-warnings、未処理の拒否には追跡可能な警告が表示されます
Karen Grigoryan

回答:


2

役立つスタックトレースを見逃した場合は、次のようにハンドラーでエラーを再スローすることにより、ノードに新しいスタックトレースを作成させることができます。

process.on('unhandledRejection', (reason, p) => { throw reason });

このようにして、犯人を突き止めることができるはずです。


私は自分の側でもう一度試すだけで、間違いなく機能します。
Gomino

@d -_- bこれをあなたの側でテストできましたか?
Gomino

こんにちは@Gomino、はい、残念ながら私のシナリオではうまくいきませんでしたが、ここであなたの助けに感謝します!
d -_- b

0

すべての提案に感謝します。私は最新のノードにアップグレードしてもう一度試しました12.14.1が、最終的にスタックトレースを表示することができました。

node --async-stack-traces myScript.jsは以下と組み合わせて使用しました:

process.on('unhandledRejection', (reason, p) => {
  console.log(reason);
});

そして、それはエラーを追跡しました。


ノード12は、そのイベントハンドラーがない場合でも、未処理の拒否理由をログに記録しませんか?
ベルギ

私が提供したソリューションを試してみませんか?
Gomino

-1

このコードの適切なスタックトレースを見つける const cyclic = Promise.resolve().then(() => cyclic); には、このコードをファイルに入れprromise_cycle.js、インスペクターで実行してデバッグします。

フラグをPause on caught exceptions有効にしてChrome DevToolsでデバッグすると、ファイルが含まれているスタックトレース全体が表示されます

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.