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

use*_*162 162 warnings unhandled-exception node.js promise async-await

来自版本7的Node.js具有async/await语法糖用于处理promises,现在在我的代码中经常出现以下警告:

(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.
Run Code Online (Sandbox Code Playgroud)

不幸的是,没有提到缺少捕获的线.有没有办法找到它而不检查每个try/catch块?

cui*_*ing 275

听取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
});
Run Code Online (Sandbox Code Playgroud)

  • 记录`error.stack`(或在上面的例子`reason.stack`中)给出了错误的完整堆栈跟踪. (27认同)
  • 为什么这不是 Node 的默认行为的一部分?我使用的是 v14.8.0,即使我使用 `--trace-warnings`,它仍然显示完全无用的消息。 (9认同)
  • 我希望我能说这有效,但事实并非如此.我在Node 8.9.4上. (7认同)
  • 我将此代码添加到我的节点 `app.js` 文件的顶部,不幸的是没有记录任何内容。节点`v10.13.0`。 (4认同)
  • 此代码根本不给您堆栈跟踪。 (4认同)
  • 我尝试了上面的代码并且因为这两个原因而未定义,并且p?有什么建议?"未处理的拒绝:承诺{状态:'被拒绝',原因:未定义}原因:未定义" (2认同)
  • 如果我使用 Jest 测试 React 应用程序,在哪里添加此代码? (2认同)

Sve*_*weg 67

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

node --trace-warnings app.js

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

如果要真正地处理未处理的拒绝(例如,通过记录他们),那么你可能想用我的unhandled-rejection模块来代替,该捕获所有支持它,用一个单一的事件处理程序每一个主要的承诺执行未处理的拒绝.

该模块支持蓝鸟,ES6承诺,Q,WhenJS, ,es6-promise,then/promise和任何符合任何未处理的抑制规范(文档中的全部细节)的.

  • 使用节点7.8.0,所有这些让我成为一堆内部节点模块的堆栈跟踪.(node:10372)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:2):在emitWarning(internal/process/promises.js:59:21)处于emitPendingUnhandledRejections(internal/process/promises.js:86:11)的undefined ._tickDomainCallback(internal/process/next_tick.js:136:7) (16认同)
  • 我没有看到任何输出显示未处理的承诺问题. (2认同)
  • 您可能正在查看弃用警告的堆栈跟踪,而不是原始未处理的错误(它应该在弃用警告*上方*的某个地方)。 (2认同)

ege*_*ter 12

这个模块让我能够追踪罪魁祸首的承诺:https: //www.npmjs.com/package/trace-unhandled

  1. 安装

    npm i trace-unhandled
    
    Run Code Online (Sandbox Code Playgroud)
  2. 包含在代码中

    require('trace-unhandled/register');
    
    Run Code Online (Sandbox Code Playgroud)


jos*_*ell 5

使用堆栈跟踪记录

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

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

  • 我尝试了这个,但“error.stack”对我来说是“未定义”。:( 节点 v14.15.4 (2认同)