在调用Mongoose函数后是否需要检查错误?

hwamh0ep  于 2023-10-19  发布在  Go
关注(0)|答案(1)|浏览(118)

范例:

let { id } = await User.findOne({ email }, '_id').exec();
if (!id) throw "error";

测试这两条指令,我意识到当findOne函数没有找到该电子邮件的文档(id)时,它会生成一个错误,并直接跳转到catch。(我使用try-catch)。
在这种情况下,第二条指令if永远不会运行。所以,如果指令似乎是无用的:只有在User.findOne中没有错误时才会执行
那么,在调用Mongoose函数后,是否有必要检查错误?或者ALL Mongoose函数自己生成错误,而你只需要使用try-catch?

ctehm74n

ctehm74n1#

Model.findOne函数没有找到匹配时,它不会抛出错误,也不会跳转到try/catch中的catch块。返回null。在你的代码中,如果你想确保查询找到一个文档(即不是null),那么你需要做你已经用if (!id)语句做过的事情。
然而,在你的例子中,你试图解构一个没有属性的对象(它甚至不是一个对象,它的null),而且它与Mongoose无关。这只是JavaScript,会抛出:

Cannot destructure property 'id' of '(intermediate value)' as it is null.

为了说明mongoose返回值,您的文档可能看起来像这样:

{
   _id: "6504794e507561a33ce92789",
   email: '[email protected]',
   age: 50
}

然后在try/catch中查询:

try{
   const user = await User.findOne({ email: '[email protected]' })
   // No document found
   // user == null
   // No error was thrown
   // Code continues to execute
} catch(err){
   console.log(err);
}

而在错误的情况下,它可能看起来像这样:

try{
   const user = await User.findOne(50)
   // Error thrown
} catch(err){
   console.log(err);
  // err == 'Parameter "filter" to findOne() must be an object, got "50" (type number)
}

请注意,当没有找到文档时,Model.find的返回值是不同的。在这些情况下,返回值是[],因此是一个空数组。
在这两种情况下,最好检查null(对于findOne)和[](对于find),这样您就可以中断控制流并向用户返回一条消息,说明没有找到任何东西。
总结一下,这将是Model.findOne的良好实践:

try{
   const user = await User.findOne({ email: '[email protected]' })
   if (!user){
    // Handle empty result 
   }
} catch(err){
   console.log(err);
}

对于Model.find来说,这是一个很好的做法:

try{
   const user = await User.find({ email: '[email protected]' })
   if (!user.length){
    // Handle empty array result 
   }
} catch(err){
   console.log(err);
}

相关问题