如何在Node.js UnhandledPromisejectionWarning中查找哪些承诺未处理?

如何在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

版本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 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
    文件的顶部,但不幸没有记录任何内容。node
    v10.13.0
    。Logging
    error.stack
    (或者在上面的示例中
    reason.stack
    )为您提供错误的完整堆栈跟踪。我希望我可以说这是有效的,但它没有。我在节点8.9.4上。我尝试了上面的代码,但由于这两个原因都未定义,p?有什么建议吗?“未处理拒绝I”