node.js - 如何确定导致 Node.js 中出现 UnhandledPromiseRejectionWarning 的原因?

标签 node.js promise async-await

我围绕 async/await 库构建了我的 Node.js 应用程序,它在大多数时间都运行良好。我遇到的唯一麻烦是,每当未履行 promise 时,我都会收到以下错误的一些变体:

(node:83333) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): TypeError: Cannot read property '_id' of null

我通常能够找到有问题的 promise ,但有时需要相当多的调试。有没有一种方法可以用来检查未处理的 promise 的行号?会让我非常头疼。

最佳答案

我建议你设置一个全局unhandledRejection handler在您的条目文件的开头:

process.on('unhandledRejection', (reason, p) => { throw reason });

这样,即使您忘记在本地捕获错误,您仍然可以轻松地找到它们。

更新

关于上述处理程序如何帮助您,似乎有些困惑。基本上,当您没有捕获到 promise 错误时, Node 会将警告输出到控制台。无论出于何种愚蠢的原因, Node 只输出错误消息而没有堆栈。设置处理程序然后重新抛出错误会生成堆栈并允许您更轻松地调试代码。这是一个例子:

let test = () => new Promise((resolve, reject) => {
    throw new Error('Random Error'); // same as "reject(new Error('Random Error'));"
});

test();

没有处理程序你会得到:

(node:20012) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Random Error

然后,我们在文件顶部添加处理程序:

process.on('unhandledRejection', (reason, p) => { throw reason });

let test = () => new Promise((resolve, reject) => {
    throw new Error('Random Error'); // same as "reject(new Error('Random Error'));"
});

test();

现在我们得到了一个更好的错误堆栈:

(function (exports, require, module, __filename, __dirname) { process.on('unhandledRejection', (reason, p) => { throw reason });
                                                                                                                ^

Error: Random Error
    at Promise (S:\amir\test.js:5:9)
    at test (S:\amir\test.js:3:18)
    at Object.<anonymous> (S:\amir\test.js:8:1)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.runMain (module.js:604:10)
    at run (bootstrap_node.js:394:7)

关于node.js - 如何确定导致 Node.js 中出现 UnhandledPromiseRejectionWarning 的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46960622/

相关文章:

javascript - 使用 async/await 时,如何在调用出错时停止执行函数?

c# - 如果 async-await 不创建任何额外的线程,那么它如何使应用程序响应?

reactjs - React TypeScript 16.8 如何使 useEffect() 异步

javascript - 删除数组中的 JSON 数据

node.js - 如何在 Docker 容器中使用 forever

node.js - Node : Check if variable is readable stream

javascript - vue-resource: 拦截ajax错误时捕获 "Uncaught (in promise)"

node.js - 使用 Mongoose-paginate 插件填充多个 Mongoose 模型字段

javascript - 如何在 Promise 中捕获未捕获的异常

javascript - .then() 回调中的 `return` 是从内部作用域还是外部作用域返回?