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拒绝的完整堆栈跟踪的正确方法是使用——trace-warnings标志运行Node.js。这将显示每个警告的完整堆栈跟踪,而不必在您自己的代码中拦截拒绝。例如:
node --trace-warnings app.js
确保trace-warnings标志出现在.js文件名之前!否则,该标志将被解释为脚本的一个参数,并且它将被Node.js本身忽略。
如果你真的想处理未处理的拒绝(例如。),那么您可能想要使用我的未处理拒绝模块,该模块为支持它的每个主要Promises实现捕获所有未处理的拒绝,使用单个事件处理程序。
该模块支持蓝鸟,ES6承诺,Q, WhenJS, ES6承诺,然后/承诺,以及任何符合任何未处理的拒绝规范(完整的细节在文档中)。
@Jeremy我得到了相同的结果,原因变量由
process.on('unhandledRejection', (reason, p) => {});
没有定义,我花了很长时间才弄清楚在我的代码中没有提供任何承诺拒绝,通常是:
new Promise((resolve reject) => {
const client = net.connect(options)
client.on("connect", () => {
resolve()
})
client.on("error", () => {
reject()
})
})
问题是你什么都没有拒绝,为了得到跟踪,你必须提供错误,就像这样
new Promise((resolve reject) => {
const client = net.connect(options)
client.on("connect", () => {
resolve()
})
client.on("error", (err) => {
reject(err)
})
})
如果你没有错误,你可以自己提供一个,即使是空的,它也会给出一个堆栈跟踪
reject(new Error())
如果您需要找到错误是从哪里抛出的,请在代码中查找带有空拒绝的Promise