Не понимаю работу anymodel.findOne.then (). Catch () - PullRequest
0 голосов
/ 10 мая 2019

Я попробовал этот код для входа в мой 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 ]

1 голос
/ 10 мая 2019

От mongodb docs :

Если ни один документ не удовлетворяет запросу, метод возвращает ноль.

catch блок Promise запускается только при возникновении ошибки (syntax ошибка с командой mongodb и т. Д.)

В вашем callback случае вы проверяете if (data), который оценивается в false, поскольку Boolean(null) равно false.

0 голосов
/ 10 мая 2019

Я допускаю, что документы драйвера не совсем описательны, но драйверы findOne ведут себя точно так же, как оболочки : выдает ошибку только в случае неправильного запроса,или если соединение с базой данных происходит неправильно, если запрос выполнен успешно, но документ не найден, результатом будет null.

0 голосов
/ 10 мая 2019

Вы должны справиться с этим так

Model.findOne( {...}, function (err, user) {
    if (err) { ... }
    if (!user) {
        // no user found, do sth
    }
}

Если данные не соответствуют запросу findOne, он вернет нулевое значение.
Если есть ошибка, тогда объект ошибки будет содержать данные.

Надеюсь, это поможет.

0 голосов
/ 10 мая 2019

Поиск записи не считается ошибкой с точки зрения MongoDB.

Второй пример работает, потому что вы проверяете, существует ли data, а не полагаетесь на то, что на самом деле есть ошибка - ключ к факту error: null.

...