Tengo una función de usuario de registro que realmente no entiendo cómo funciona...
module.exports.signupUser = async (req, res) => { let email = req.body.email; let password = req.body.password; if(!validator.isEmail(email)) { res.status(400).json({ "message": "Please enter a valid email!" }).end(); } else if(!validator.isLength(password, {min:6})){ res.status(400).json({ "message": "Password must have at least 6 characters!" }).end(); } else { const salt = bcrypt.genSaltSync(10); const hashedPassword = await bcrypt.hash(password, salt); let params = [email, hashedPassword]; console.log(hashedPassword); let query = 'insert into users (email, password) values (?,?)'; connection.query(query, params, (err, result, fields) => { if(err && err.code === 'ER_DUP_ENTRY') { res.status(400).json({ "message": "There is an account already associated with this email adress!" }).end(); } else { res.status(200).json({ "message": "User created!" }).end(); } }); }}
Entonces, en el último caso, uso await bcrypt.hash (contraseña, sal) para cifrar mi contraseña. Soy nuevo en JS, pero aún así entiendo que await ejecuta el código de forma asincrónica, por lo que console.log (hashedPassword) no debería devolverme la contraseña cifrada porque este registro se ejecutará antes que el hash real. ¿Alguien puede explicarme qué está pasando realmente?
const hashedPassword = await bcrypt.hash(password, salt); console.log(hashedPassword);Si usa la palabra clave await, nodejs esperará a que se resuelva la promesa antes de pasar a la siguiente línea en la función asíncrona. El resultado de su console.log será la contraseña cifrada.
Si no usa la palabra clave await, el nodo comenzará a resolver la promesa pero no esperará a que termine de resolverse antes de pasar a la siguiente línea. El resultado de su console.log será Promise {pendiente}
await ejecuta el código sincrónicamente. Entonces, en su caso, await esperará la ejecución de bcrypt.hash .
Para mayor claridad, la función bcrypt.hash devuelve una promise y ahora tenemos dos opciones aquí.
const hashedPassword = await bcrypt.hash(password, salt); console.log(hashedPassword); hashedPassword contendrá el resultado real que necesitamos.
then bcrypt.hash(password, salt).then(hashedPassword => { console.log(hashedPassword); }) Como la función bcrypt.hash devuelve una promesa, debemos manejar el resto del código dentro de un bloque luego, ya que solo devolverá el valor una vez que la función resuelva la promesa.
En caso de que desee ejecutar su código de asynchronously , debe eliminar la palabra clave await que espera a que se resuelva la promesa antes de pasar a la siguiente línea.