提问人:Kevin Flynn 提问时间:9/20/2023 最后编辑:General GrievanceKevin Flynn 更新时间:9/22/2023 访问量:35
调用 Mongoose 函数后是否需要检查错误?
Is it necessary to check for error after calling a Mongoose function?
问:
例:
let { id } = await User.findOne({ email }, '_id').exec();
if (!id) throw "error";
测试这两个指令,我意识到当函数找不到该电子邮件的文档(id)时,它会生成错误,并直接跳转到捕获。(我正在使用 try-catch)。findOne
在这种情况下,第二条指令 if 永远不会运行。因此,如果指令看起来无用:只有当User.findOne中没有错误时,它才会被执行
那么:调用 Mongoose 函数后是否有必要检查错误? 还是所有猫鼬函数自己生成错误,你只需要使用 try-catch?
答:
1赞
jQueeny
9/20/2023
#1
当函数找不到匹配项时,它不会抛出错误,也不会跳转到 .它返回 .在代码中,如果要确保查询找到文档(即未找到),则需要执行对语句所做的操作。Model.findOne
catch
try/catch
null
null
if (!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 ),以便可以中断控制流并向用户返回一条消息,指出未找到任何内容。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);
}
评论