我尝试使用此代码登录我的API
user.post("/login", (req, res) => {
let email = req.body.email;
let password = req.body.password;
userModel
.findOne({ $and: [{ email: email }, { password: password }] })
.then((data) => {
res.status(200).json({
text: "User found",
data: data
});
})
.catch((err) => {
res.status(404).json({
text: "user not found",
error: err
});
});
});
当我在邮递员中以不存在的值(电子邮件和密码)发送API请求时,它在下面显示json响应
{
"text": "User found",
"data": null
}
这意味着findOne不会返回任何错误。
然后,我将代码更改为
userModel.findOne(
{ $and: [{ email: email }, { password: password }] },
(err, data) => {
if (data) {
res.status(200).json({
text: "User found",
data: data
});
} else {
res.status(404).json({
text: "user not found",
error: err
});
}
}
);
现在不存在的凭据的json响应是
{
"text": "user not found",
"error": null
}
为什么'then block'在第一次试用中起作用,即使findOne也不返回任何数据? 如果找不到数据,MongoDB findOne函数将返回什么?
答案 0 :(得分:1)
来自mongodb docs:
如果没有文档满足查询条件,则该方法返回null。
catch
的{{1}}块仅在发生错误时发生(Promise
命令出现syntax
错误等)
在您的mongodb
情况下,您正在检查callback
为if (data)
的{{1}}的值为false
。
答案 1 :(得分:0)
就MongoDB而言,未找到记录不视为错误。
第二个示例之所以有效,是因为您正在检查data
是否存在,而不是依靠实际上是否存在错误-线索是事实error: null
。
答案 2 :(得分:0)
您应该以这种方式处理
Model.findOne( {...}, function (err, user) {
if (err) { ... }
if (!user) {
// no user found, do sth
}
}
如果没有数据与findOne查询匹配,则它将返回空值。
如果有错误,则错误对象将包含数据。
希望有帮助。
答案 3 :(得分:0)
我承认driver docs的描述性不强,但是驱动程序findOne
的行为与shells one完全相同:仅在查询错误或与之连接时抛出错误数据库出错,如果查询成功但未找到文档,则结果为null
。