查找未处理的承诺拒绝的来源: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);,因此不要搜索未处理的诺言拒绝,这是在节点的内部代码中。
Kaiido

1
一些代码增加了这个问题将是有帮助的。
x00

运行npm i bluebird并添加const Promise = require('bluebird')到代码中,可能会给您更详细的错误消息
n3ko

尝试运行带有的节点--trace-warnings,未处理的拒绝伴随着您可以跟踪的警告
Karen Grigoryan

Answers:


2

如果您错过了有用的堆栈跟踪,则可以通过将错误重新抛出到处理程序中来使节点创建一个新的堆栈跟踪:

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

这样,您应该能够找到罪魁祸首。


我只是再尝试一次,它肯定有效。
戈米诺

@d -_- b您是否可以一边测试一下?
戈米诺

嗨,@Gomino,是的,不幸的是,在我的情况下,它不起作用,但感谢您的帮助!
d -_- b

0

感谢所有的建议。我通过升级到最新的Node再次尝试12.14.1,终于能够获取它以显示堆栈跟踪:

node --async-stack-traces myScript.js结合使用:

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

并且它跟踪了错误。


即使没有该事件处理程序,节点12也不记录未处理的拒绝原因吗?
Bergi

您甚至没有尝试我提供的解决方案吗?
戈米诺

-1

为了找到此代码的良好堆栈跟踪, const cyclic = Promise.resolve().then(() => cyclic); 我将此代码放入文件中,prromise_cycle.js并与检查器一起运行以对其进行调试。

我在Pause on caught exceptions启用了标记的Chrome DevTools上对其进行了调试,然后可以看到整个堆栈跟踪以及文件

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.