如何在Node.js UnhandledPromisejectionWarning中查找哪些承诺未处理?
版本7中的Node.js具有异步/等待语法糖来处理承诺,现在在我的代码中经常出现以下警告:如何在Node.js UnhandledPromisejectionWarning中查找哪些承诺未处理?,node.js,promise,async-await,warnings,unhandled-exception,Node.js,Promise,Async Await,Warnings,Unhandled Exception,版本7中的Node.js具有异步/等待语法糖来处理承诺,现在在我的代码中经常出现以下警告: (node:11057) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): ReferenceError: Error: Can't set headers after they are sent. (node:11057) DeprecationWarning: Unhandled pro
(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块的情况下找到它?侦听进程的事件
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
// application specific logging, throwing an error, or other logic here
});
倾听过程中的事件
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承诺拒绝,显示完整stacktrace的正确方法是使用--trace warnings
标志运行Node.js。这将显示每个警告的完整stacktrace,而不必从您自己的代码中截取拒绝。例如:
node --trace-warnings app.js
节点--跟踪警告app.js
确保跟踪警告
标志位于.js
文件名之前!否则,该标志将被解释为脚本的参数,Node.js本身将忽略它
如果您希望实际处理未经处理的拒绝(例如,通过记录它们),那么您可能希望改用my module,它使用单个事件处理程序捕获支持它的每个主要Promises实现的所有未经处理的拒绝
该模块支持Bluebird、ES6 promise、Q、WhenJS、ES6 promise
、then/promise
,以及符合任何未处理拒绝规范的任何内容(文档中的完整详细信息)。显示未处理ES6 promise拒绝的完整堆栈跟踪的正确方式,是使用--trace warnings
标志运行Node.js。这将显示每个警告的完整stacktrace,而不必从您自己的代码中截取拒绝。例如:
node --trace-warnings app.js
节点--跟踪警告app.js
确保跟踪警告
标志位于.js
文件名之前!否则,该标志将被解释为脚本的参数,Node.js本身将忽略它
如果您希望实际处理未经处理的拒绝(例如,通过记录它们),那么您可能希望改用my module,它使用单个事件处理程序捕获支持它的每个主要Promises实现的所有未经处理的拒绝
该模块支持Bluebird、ES6 promise、Q、WhenJS、ES6 promise
、then/promise
,以及符合任何未处理拒绝规范的任何内容(文档中有详细信息)。使用堆栈跟踪进行日志记录
如果您正在查找更多有用的错误消息。尝试将其添加到节点文件中。它应该显示发生崩溃的完整堆栈跟踪
process.on('unhandledRejection', (error, p) => {
console.log('=== UNHANDLED REJECTION ===');
console.dir(error.stack);
});
使用堆栈跟踪进行日志记录
如果您正在查找更多有用的错误消息。尝试将其添加到节点文件中。它应该显示发生崩溃的完整堆栈跟踪
process.on('unhandledRejection', (error, p) => {
console.log('=== UNHANDLED REJECTION ===');
console.dir(error.stack);
});
本模块允许我追踪罪犯承诺:
npm i trace-unhandled
require('trace-unhandled/register');
本模块允许我追踪罪犯承诺:
npm i trace-unhandled
require('trace-unhandled/register');
您可以使用Bluebird promise库,它可能会给您一个堆栈跟踪。也许注册到节点的
unhandledRejection
事件会有所帮助?看。您的回调将获得Error
对象和实际的Promise
,我相信Error
对象可能包含堆栈跟踪。如果前面的两条注释没有帮助,则无法在发送后设置标题。
应该可以为您的代码中可能发生这种情况提供线索(也就是说,您正在某个地方设置头,而这些头可能已经发送了——可能是因为无法理解异步代码,但这只是猜测)您好,这些消息有助于确定错误在代码中的位置,顺便说一句,这并不像了解代码行那么容易。@jfriend00事实证明,这是一个异步函数抛出错误的情况——这些异步函数的内部节点承诺永远不会使用Bluebird,因此使用Bluebird在这种情况下没有帮助。您可以使用luebird promise库,它可能会给您一个堆栈跟踪。也许注册到节点的unhandledRejection
事件会有所帮助?请参阅。您的回调将获得Error
对象和实际的promise
,我相信Error
对象可能包含堆栈跟踪。如果前面的两条注释不起作用p、 然后,无法在发送头之后设置头。
应该会告诉您在代码中的什么地方可能会发生这种情况(即,在发送头之后的某个地方设置头-可能是因为无法理解异步代码,但这只是猜测)您好,这些消息有助于确定错误在代码中的位置,顺便说一句,这并不像了解代码行那么容易。@jfriend00事实证明,这是一个异步函数抛出错误的情况——这些异步函数的内部节点承诺永远不会使用Bluebird,因此使用Bluebird在这种情况下没有帮助。记录error.stack
(或者在上面的示例中reason.stack
)提供了错误的完整堆栈跟踪。我希望我可以说这是有效的,但它没有。我在节点8.9.4上。我尝试了上面的代码,但由于这两个原因都没有定义,p?有什么建议吗?“未处理的拒绝:承诺{state:'rejected',reason:undefined}原因:undefined“尝试了这个,效果很好!很快解决了我的问题。我将此代码添加到我的节点app.js
文件的顶部,但不幸没有记录任何内容。nodev10.13.0
。Loggingerror.stack
(或者在上面的示例中reason.stack
)为您提供错误的完整堆栈跟踪。我希望我可以说这是有效的,但它没有。我在节点8.9.4上。我尝试了上面的代码,但由于这两个原因都未定义,p?有什么建议吗?“未处理拒绝I”