如何在 Node.js UnhandledPromiseRejectionWarning 中找到未处理的承诺?
How to find which promises are unhandled in Node.js UnhandledPromiseRejectionWarning?
Node.js 来自版本 7 的 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 块就找到它?
监听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
});
显示未处理的 ES6 Promise 拒绝的完整堆栈跟踪的 正确 方法是 运行 Node.js 带有 --trace-warnings
标志。这将显示每个警告的完整堆栈跟踪,而不必从您自己的代码中拦截拒绝。例如:
node --trace-warnings app.js
确保 trace-warnings
标志位于 之前 您的 .js
文件的名称!否则,该标志将被解释为脚本的参数,并且 Node.js 本身将忽略它。
如果你想真正处理未处理的拒绝(例如通过记录它们),那么你可能想使用我的unhandled-rejection
模块,它捕获所有使用单个事件处理程序支持它的每个主要 Promise 实现的未处理拒绝。
该模块支持 Bluebird、ES6 Promises、Q、WhenJS、es6-promise
、then/promise
以及符合任何未处理拒绝规范的任何内容(文档中的完整详细信息)。
使用堆栈跟踪记录
如果您正在寻找更多有用的错误消息。尝试将其添加到您的节点文件中。它应该显示发生崩溃的完整堆栈跟踪。
process.on('unhandledRejection', (error, p) => {
console.log('=== UNHANDLED REJECTION ===');
console.dir(error.stack);
});
这个模块让我找到了罪魁祸首承诺:
https://www.npmjs.com/package/trace-unhandled
安装
npm i trace-unhandled
包含在代码中
require('trace-unhandled/register');
@Jeremy 我得到了同样的结果,reason
变量由
提供
process.on('unhandledRejection', (reason, p) => {});
未定义,我花了一些时间才弄清楚我的代码中没有提供任何承诺拒绝,通常是:
new Promise((resolve reject) => {
const client = net.connect(options)
client.on("connect", () => {
resolve()
})
client.on("error", () => {
reject()
})
})
问题是你 reject
什么都没有,要获得跟踪,你必须提供错误,就像这样
new Promise((resolve reject) => {
const client = net.connect(options)
client.on("connect", () => {
resolve()
})
client.on("error", (err) => {
reject(err)
})
})
如果你没有错误你可以自己提供一个,即使是空的,它也会给出堆栈跟踪
reject(new Error())
如果您需要找到错误的来源,请在您的代码中查找 Promise
with empty rejection
Node.js 来自版本 7 的 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 块就找到它?
监听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
});
显示未处理的 ES6 Promise 拒绝的完整堆栈跟踪的 正确 方法是 运行 Node.js 带有 --trace-warnings
标志。这将显示每个警告的完整堆栈跟踪,而不必从您自己的代码中拦截拒绝。例如:
node --trace-warnings app.js
确保 trace-warnings
标志位于 之前 您的 .js
文件的名称!否则,该标志将被解释为脚本的参数,并且 Node.js 本身将忽略它。
如果你想真正处理未处理的拒绝(例如通过记录它们),那么你可能想使用我的unhandled-rejection
模块,它捕获所有使用单个事件处理程序支持它的每个主要 Promise 实现的未处理拒绝。
该模块支持 Bluebird、ES6 Promises、Q、WhenJS、es6-promise
、then/promise
以及符合任何未处理拒绝规范的任何内容(文档中的完整详细信息)。
使用堆栈跟踪记录
如果您正在寻找更多有用的错误消息。尝试将其添加到您的节点文件中。它应该显示发生崩溃的完整堆栈跟踪。
process.on('unhandledRejection', (error, p) => {
console.log('=== UNHANDLED REJECTION ===');
console.dir(error.stack);
});
这个模块让我找到了罪魁祸首承诺: https://www.npmjs.com/package/trace-unhandled
安装
npm i trace-unhandled
包含在代码中
require('trace-unhandled/register');
@Jeremy 我得到了同样的结果,reason
变量由
process.on('unhandledRejection', (reason, p) => {});
未定义,我花了一些时间才弄清楚我的代码中没有提供任何承诺拒绝,通常是:
new Promise((resolve reject) => {
const client = net.connect(options)
client.on("connect", () => {
resolve()
})
client.on("error", () => {
reject()
})
})
问题是你 reject
什么都没有,要获得跟踪,你必须提供错误,就像这样
new Promise((resolve reject) => {
const client = net.connect(options)
client.on("connect", () => {
resolve()
})
client.on("error", (err) => {
reject(err)
})
})
如果你没有错误你可以自己提供一个,即使是空的,它也会给出堆栈跟踪
reject(new Error())
如果您需要找到错误的来源,请在您的代码中查找 Promise
with empty rejection