Intenté este código para iniciar sesión en mi 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
            });
        });
});

Cuando envío una solicitud de API en cartero con valores no existentes (correo electrónico y contraseña) muestra la respuesta de json a continuación

{
    "text": "User found",
    "data": null
}

Eso significa que findOne no devuelve ningún error.

Entonces, cambié mi código a

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
                });
            }
        }
    );

Ahora la respuesta json para credenciales no existentes es

{
    "text": "user not found",
    "error": null
}

¿Por qué funciona 'bloquear' en la primera prueba, incluso el findOne no devuelve ningún dato? ¿Qué devolverá la función findOne de MongoDB cuando no se encuentren datos?

0
Jifri Valanchery 10 may. 2019 a las 12:43

4 respuestas

La mejor respuesta

De documentos mongodb:

Si ningún documento satisface la consulta, el método devuelve nulo.

El bloque catch de Promise se activa solo cuando se produce un error (error syntax con el comando mongodb, etc.)

En su caso callback está marcando if (data) que se evalúa como false ya que Boolean(null) es false.

1
1565986223 10 may. 2019 a las 09:57

Admito que los documentos del controlador son no del todo descriptivo, pero los controladores findOne se comportan exactamente como shells one: solo arroja un error si la consulta es incorrecta, o la conexión a la base de datos falla, si la consulta tiene éxito pero no se encuentra ningún documento, el resultado será null.

0
Jonas Wilms 10 may. 2019 a las 09:52

No encontrar un registro no se considera un error en lo que respecta a MongoDB.

El segundo ejemplo funciona porque está comprobando si existe data en lugar de confiar en que realmente haya un error; la clave está en el hecho error: null.

0
James 10 may. 2019 a las 09:48

Deberías manejarlo de esa manera

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

Si ningún dato coincide con la consulta findOne, devolverá un valor nulo.
Si hay un error, el objeto de error contendrá datos.

Espero que ayude.

0
Flo 10 may. 2019 a las 09:51