不明白 anymodel.findOne.then().catch() 的工作原理
Don't understand working of anymodel.findOne.then().catch()
我尝试使用此代码登录我的 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 没有 return 任何错误。
然后,我将代码更改为
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都return没有数据?
当找不到数据时,MongoDB findOne 函数 return 会怎样?
就 MongoDB 而言,找不到记录不被视为错误。
第二个示例有效,因为您正在检查 data
是否存在,而不是依赖实际存在的错误 - 线索就在 error: null
.
事实中
来自 mongodb docs:
If no document satisfies the query, the method returns null.
catch
块 Promise
仅在发生错误时触发(syntax
错误与 mongodb
命令等)
在您的 callback
案例中,您正在检查 if (data)
,它的计算结果为 false
,因为 Boolean(null)
是 false
。
你应该这样处理
Model.findOne( {...}, function (err, user) {
if (err) { ... }
if (!user) {
// no user found, do sth
}
}
如果没有数据匹配 findOne 查询,那么它将 return 一个空值。
如果有错误,错误对象将包含数据。
希望对您有所帮助。
我承认 driver docs are not quite descriptive, but the drivers findOne
behaves exactly like the shells one: 只会在查询错误,或者数据库连接出错的情况下抛出错误,如果查询成功但是找不到文档,结果会是null
.
我尝试使用此代码登录我的 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 没有 return 任何错误。
然后,我将代码更改为
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都return没有数据? 当找不到数据时,MongoDB findOne 函数 return 会怎样?
就 MongoDB 而言,找不到记录不被视为错误。
第二个示例有效,因为您正在检查 data
是否存在,而不是依赖实际存在的错误 - 线索就在 error: null
.
来自 mongodb docs:
If no document satisfies the query, the method returns null.
catch
块 Promise
仅在发生错误时触发(syntax
错误与 mongodb
命令等)
在您的 callback
案例中,您正在检查 if (data)
,它的计算结果为 false
,因为 Boolean(null)
是 false
。
你应该这样处理
Model.findOne( {...}, function (err, user) {
if (err) { ... }
if (!user) {
// no user found, do sth
}
}
如果没有数据匹配 findOne 查询,那么它将 return 一个空值。
如果有错误,错误对象将包含数据。
希望对您有所帮助。
我承认 driver docs are not quite descriptive, but the drivers findOne
behaves exactly like the shells one: 只会在查询错误,或者数据库连接出错的情况下抛出错误,如果查询成功但是找不到文档,结果会是null
.