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

Is it necessary to check for error after calling a Mongoose function?

提问人:Kevin Flynn 提问时间:9/20/2023 最后编辑:General GrievanceKevin Flynn 更新时间:9/22/2023 访问量:35

问:

例:

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

测试这两个指令,我意识到当函数找不到该电子邮件的文档(id)时,它会生成错误,并直接跳转到捕获。(我正在使用 try-catch)。findOne

在这种情况下,第二条指令 if 永远不会运行。因此,如果指令看起来无用:只有当User.findOne中没有错误时,它才会被执行

那么:调用 Mongoose 函数后是否有必要检查错误? 还是所有猫鼬函数自己生成错误,你只需要使用 try-catch?

猫鼬 错误处理 try-catch

评论


答:

1赞 jQueeny 9/20/2023 #1

当函数找不到匹配项时,它不会抛出错误,也不会跳转到 .它返回 .在代码中,如果要确保查询找到文档(即未找到),则需要执行对语句所做的操作。Model.findOnecatchtry/catchnullnullif (!id)

但是,在您的例子中,您正在尝试破坏一个没有属性的对象(它甚至不是一个对象,它的 ),并且与猫鼬无关。这只是 JavaScript,会抛出:null

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[]

无论哪种情况,最好检查 (for ) 和检查 (for ),以便可以中断控制流并向用户返回一条消息,指出未找到任何内容。nullfindOne[]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);
}