Node.js从版本7开始有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块的情况下找到它?


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

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

node --trace-warnings app.js

确保trace-warnings标志出现在.js文件名之前!否则,该标志将被解释为脚本的一个参数,并且它将被Node.js本身忽略。

如果你真的想处理未处理的拒绝(例如。),那么您可能想要使用我的未处理拒绝模块,该模块为支持它的每个主要Promises实现捕获所有未处理的拒绝,使用单个事件处理程序。

该模块支持蓝鸟,ES6承诺,Q, WhenJS, ES6承诺,然后/承诺,以及任何符合任何未处理的拒绝规范(完整的细节在文档中)。


使用堆栈跟踪记录日志

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

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

这个模块让我找到了罪魁祸首的承诺: https://www.npmjs.com/package/trace-unhandled

安装 NPM I跟踪-未处理 包含在代码中 要求(“trace-unhandled /注册”);


@Jeremy我得到了相同的结果,原因变量由

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

没有定义,我花了很长时间才弄清楚在我的代码中没有提供任何承诺拒绝,通常是:

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

问题是你什么都没有拒绝,为了得到跟踪,你必须提供错误,就像这样

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

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

reject(new Error())

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