Estoy usando Nodejs y MySQL para validar las contraseñas de los usuarios. Tengo dificultades para acceder a mi objeto de respuesta (res) para enviar una respuesta al cliente. Por alguna razón, funciona por encima de mi función bcrypt pero no por debajo. Necesito acceder a él a continuación para poder enviar mi token JWT al cliente. Vea a continuación los ejemplos de código. Gracias.
**WORKING EXAMPLE** **res.send(data) is properly sending data back to the client** app.post("/login", jsonParser,(req, res) => { let selectQuery = 'SELECT * FROM ?? WHERE ?? = ?'; let query = mysql.format(selectQuery,["users","username", req.body.username]); pool.query(query,(err, data) => { if(err) { console.error(err); } //works here---> res.send(data) let match = bcrypt.compareSync(req.body.password, data[0].password) console.log(match) match ? token = generateToken(data[0]): token = null }) }) **NON-WORKING EXAMPLE** **res.send(data) is NOT sending data back to the client. TIMED OUT** app.post("/login", jsonParser,(req, res) => { let selectQuery = 'SELECT * FROM ?? WHERE ?? = ?'; let query = mysql.format(selectQuery,["users","username", req.body.username]); pool.query(query,(err, data) => { if(err) { console.error(err); } let match = bcrypt.compareSync(req.body.password, data[0].password) console.log(match) //not here----> res.send(data) match ? token = generateToken(data[0]): token = null }) }) **The same code using try catch** app.post("/login", jsonParser,(req, res) => { let selectQuery = 'SELECT * FROM ?? WHERE ?? = ?'; let query = mysql.format(selectQuery,["users","username", req.body.username]); pool.query(query,(err, data) => { if(err) { console.error(err); } try { let match = bcrypt.compareSync(req.body.password, data[0].password) match ? token = generateToken(data[0]): token = null } catch (exception_var) { console.log('exception', exception_var) } finally { res.send(token) } }) }) function generateToken(data) { const secret = process.env.JWT_SECRET; console.log('inside generate token!', data) const payload = { data: data.username, //department: data.department, subject: data.id, }; console.log(payload,'payload') const options = { expiresIn: "1d", }; return jwt.sign(payload, secret, options); }bcrypt.compare es una función asíncrona. Entonces, puedes usarlo de dos maneras. Use la función de devolución de llamada o Use async await
app.post("/login", jsonParser,(req, res) => { let selectQuery = 'SELECT * FROM ?? WHERE ?? = ?'; let query = mysql.format(selectQuery,["users","username", req.body.username]); pool.query(query, async (err, data) => { // Declare the function as async function if(err) { return console.error(err); } const match = await compare(req.body.password, data[0].password) // wait for the data from function const token = match ? generateToken(data[0]) : null res.send(token) }) })