不明白 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.

catchPromise 仅在发生错误时触发(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.