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

时间:2017-05-07 17:31:41

标签: node.js promise async-await warnings unhandled-exception

来自版本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块的情况下找到它?

4 个答案:

答案 0 :(得分:246)

听取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
});

答案 1 :(得分:60)

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

node --trace-warnings app.js

确保trace-warnings标志来自之前 .js文件的名称!否则,该标志将被解释为您的脚本的参数,Node.js将忽略它。

如果你想实际处理未处理的拒绝(例如通过记录它们),那么你可能想要使用我的unhandled-rejection模块,它可以捕获每个主要的所有未处理的拒绝使用单个事件处理程序的Promise实现支持它。

该模块支持Bluebird,ES6 Promises,Q,WhenJS,es6-promisethen/promise以及任何符合任何未处理拒绝规范的内容(文档中的完整详细信息)。

答案 2 :(得分:1)

使用堆栈跟踪记录

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

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

答案 3 :(得分:0)

该模块使我能够追究罪魁祸首: https://www.npmjs.com/package/trace-unhandled

  1. 安装

    npm i trace-unhandled
    
  2. 包含在代码中

    require('trace-unhandled/register');