如何在Node.js UnhandledPromiseRejectionWarning中找到未处理的promises?

3wabscal  于 12个月前  发布在  Node.js
关注(0)|答案(5)|浏览(141)

Node.js从版本7开始就有了处理promise的语法糖,现在在我的代码中,以下警告经常出现:

(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块就找到它?

6xfqseft

6xfqseft1#

监听进程的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
});
pprl5pva

pprl5pva2#

显示未处理的ES6 Promise拒绝的完整堆栈跟踪的正确方法是使用--trace-warnings标志运行Node.js。这将显示每个警告的完整堆栈跟踪,而不必从您自己的代码中拦截拒绝。举例来说:

node --trace-warnings app.js

确保trace-warnings标志位于.js文件名之前!否则,该标志将被解释为脚本的参数,并且它将被Node.js本身忽略。
如果你真的想 * 处理 * 未处理的拒绝(例如。通过记录它们),那么你可能想使用我的unhandled-rejection模块,它用一个事件处理程序捕获每个支持它的主要Promises实现的所有未处理的拒绝。
该模块支持Bluebird,ES6 Promises,Q,WhenJS,es6-promisethen/promise以及任何符合任何未经处理的拒绝规范的内容(文档中的完整细节)。

wmtdaxz3

wmtdaxz33#

使用堆栈跟踪记录日志

如果您正在寻找更有用的错误消息。尝试将其添加到节点文件中。它应该显示崩溃发生的完整堆栈跟踪。

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

x759pob24#

这个模块允许我追踪罪魁祸首promise:https://www.npmjs.com/package/trace-unhandled
1.安装

npm i trace-unhandled

1.包含在代码中

require('trace-unhandled/register');
n6lpvg4x

n6lpvg4x5#

@Jeremy我有相同的结果,reason变量由

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

没有定义,我花了很多时间才弄清楚,在我的代码中有一个promise rejection什么也没有提供,通常是:

new Promise((resolve reject) => {
  const client = net.connect(options)
  client.on("connect", () => {
    resolve()
  })
  client.on("error", () => {
    reject()
  })
})

问题是,您reject什么都没有,要获得跟踪,您必须提供错误,如下所示

new Promise((resolve reject) => {
  const client = net.connect(options)
  client.on("connect", () => {
    resolve()
  })
  client.on("error", (err) => {
    reject(err)
  })
})

如果你没有错误,你可以自己提供一个,即使是空的,它也会给予一个堆栈跟踪

reject(new Error())

如果您需要找到错误是从哪里抛出的,请在代码中查找带空拒绝的Promise

相关问题