Tengo una función que comprueba si un usuario es administrador o no. Si encuentra la identificación del usuario en la tabla de la base de datos, debe devolver true , de lo contrario, debe devolver false , pero me estoy quedando undefined . ¿Me puedes ayudar?
function isAdmin(useruid) { db.query("SELECT * FROM admins", function(err,rows,field) { if(!err) { rows.forEach(function(element) { if (useruid === element.uid) { console.log("[is admin] Found admins!") return true; } else { console.log("[is admin] User is not admin!") return false; } }); } else { console.log(err); return false; } }) } agregué ; en las líneas que faltan. Recibo el resultado de console.logs, pero la función sigue devolviendo undefined en lugar de false o true .
Parece que:
function isAdmin(useruid) { db.query("SELECT * FROM admins", function(err,rows,field) { if(!err) { rows.forEach(function(element) { if (useruid === element.uid) { console.log("[is admin] Found admins!"); return true; } else { console.log("[is admin] User is not admin!"); return false; } }); } else { console.log(err); return false; } }) }Como se señaló, la solución es más complicada de lo que podría sospechar dada la naturaleza asíncrona de Node. Hay varias formas de abordar el problema que presenta su pregunta, pero incluiré solo una aquí que es relativamente flexible y liviana.
La buena noticia es que su función isAdmin y la consulta que incluye se puede hacer mucho más simple, por lo que recogerá algunas líneas de código allí.
Dado que comienza con un UID y su objetivo es solo verificar que existe en la tabla, puede usar una consulta dirigida y omitir todos los bucles de resultados. Esto ahorrará tiempo y recursos tanto en Node como en MySQL.
Función actualizada Tenga en cuenta que ahora es una función async con una Promise . De esta manera podemos llamar más tarde y await los resultados. Además, db.query toma un argumento para ? marcador de posición Le pasamos nuestra variable useruid .
const isAdmin = async (useruid) => { return new Promise((resolve, reject) => { db.query('SELECT uid FROM admins WHERE uid = ?;', useruid, function (error, results, fields) { if (error) reject(error); // when we get our results we can simply check for length // if we have length, there was a match // if we have no length, there was no match resolve(results.length ? true : false) }); }); }; Para llamar a la función... Debemos ajustar la función async si queremos aprovechar await
(async function(){ let is_admin = await isAdmin(YOUR_UID_VALUE); console.log('is_admin', is_admin); })();