我围绕async / await库构建了我的Node.js应用程序,并且它在大多数情况下都运行良好。我遇到的唯一麻烦是,只要承诺没有实现,我就会得到以下错误的一些变化:
(node:83333) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): TypeError: Cannot read property '_id' of null
我能够找到违规的承诺,但有时需要进行相当多的调试。有没有一种方法可以用来检查未处理的承诺的行号?会给我带来相当大的麻烦。
答案 0 :(得分:5)
警告是由您的某个承诺中发生错误引起的,但您没有处理它,这意味着您的承诺不会处理catch
以及您正在处理then
。
处理承诺catch
以及您正在使用then
这是一个很好的做法,所以无论您处理错误的情况如何都要记住,即使您是100%确定这个承诺不会导致错误。
这将为您提供更好,更快的方式来调试任何问题....所以对于任何承诺只需处理catch
示例
promise.then((result)=>{
//Do something here
} , (error) =>{
//Handle promise rejection
}).catch((err) => {
//Handle error here, lets say for example, this promise is just updating user
//console.log("update user error")
//console.log(err); to be able to understand what is the error
})
因此,如果您使用上述方式处理任何承诺......您将能够知道您的错误究竟在哪里......
我通常做的一件事是console.log
承诺在错误console.log
之前做了什么,正如您在上面的代码中看到的那样我认为这个承诺只是更新用户...所以我在捕获“更新用户错误”
现在您知道此错误在更新用户承诺
中答案 1 :(得分:4)
我建议您在输入文件的最开头设置一个全局unhandledRejection
handler:
process.on('unhandledRejection', (reason, p) => { throw reason });
这样,即使您忘记在本地捕获错误,您仍然可以轻松地跟踪它们。
<强>更新强>
对于上述处理程序如何帮助您,似乎存在一些混淆。基本上,当您没有捕获promise错误时,节点输出会向控制台发出警告。无论什么愚蠢的原因,节点只输出没有堆栈的错误消息。设置处理程序然后重新抛出错误会生成堆栈,并允许您更轻松地调试代码。这是一个例子:
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)