来自版本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块的情况下找到它?
答案 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-promise
,then/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
安装
npm i trace-unhandled
包含在代码中
require('trace-unhandled/register');