不了解anymodel.findOne.then()。catch()的工作方式

时间:2019-05-10 09:43:48

标签: javascript node.js mongodb return-value catch-block

我尝试使用此代码登录我的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函数将返回什么?

4 个答案:

答案 0 :(得分:1)

来自mongodb docs

  

如果没有文档满足查询条件,则该方法返回null。

catch的{​​{1}}块仅在发生错误时发生(Promise命令出现syntax错误等)

在您的mongodb情况下,您正在检查callbackif (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