Digamos que quiero ejecutar una declaración if donde la condición es una función asíncrona.
const con = require('./con'); if(con.con('email@gmail.com') console.log('User exists!') else { console.log('user does not exist?') }Esta es la función, utiliza mongoose findOne, que es una tarea asíncrona.
const User = require ('../nodeDB/models/user.js'); const con = function (email) { User.findOne( { userEmail: email }, function (err, doc) { if(err) { console.log(err); } if (doc) { return false; } else { return true; } }); } module.exports.con = con;El problema es que se llama a la declaración if antes de que se pueda ejecutar la estafa, lo que no establece la condición.
En primer lugar, su función con() no devuelve nada. Deberá return User.findOne(....)
Su declaración if debe respetar el hecho de que la tarea asíncrona debe completarse primero.
con.con('email@gmail.com') .then((exists) => { if (exists) console.log('User exists!') else { console.log('user does not exist?') } }) O con aynsc / await :
async function checkIfUserExists() { if (await con.con('email@gmail.com') console.log('User exists!') else { console.log('user does not exist?') } }Use await o ponga su lógica y then bloquee.
// must be in async declared function if (await foo()) { } else { } // or foo().then(res=>{ if (res) { } else { } })Puedes hacerlo de esta manera:
const con = userEmail => User.findOne({userEmail}).lean().exec(); (async () => { if (await con('email@gmail.com')) { console.log('User exists!') } else { console.log('user does not exist?') } })()User.findOne desde tu función. (opcional) 2. .lean() (devuelve JSON simple, más rápido)
(opcional) 3. Añádelo .exec() para que devuelva una Promesa verdadera y no solo una opción entonces.
await con() en cualquier lugar dentro de una función async , como si fuera síncrona.