obtuve esta función para verificar si el nombre de usuario es un administrador.
module.exports = { checkAdmin: function(username){ var _this = this; var admin = null; sql.execute(sql.format('SELECT * FROM tbl_admins'), (err, result, fields) => { if (err) { logger.error(err.message); return; } adminArray = [] result.forEach(element => { if(element.Username == username){ adminArray.push(element.Username) } }); if (adminArray.includes(username)){ _this.admin = true; }else{ _this.admin = false; } }) return admin;} }
Y esto está en el archivo Express.
var check = Admin.checkAdmin(req.body.username); if (check == false) { console.log("Wrong") res.send({ message: 'Access denied' }); //bad request return; }El SQL es correcto. El problema es establecer la variable "admin" dentro de la función SQL. La función devuelve "".
Gracias
No puedo evitar notar que toda su función checkAdmin tiene un estilo que no había visto antes. Déjame tratar de simplificarlo un poco, tal vez ayude con el problema.
// Admin.js // Return a Promise, so it's easier // to deal with the asynchronous SQL Call function checkAdmin (username) { return new Promise((resolve, reject) => { sql.execute( sql.format('SELECT * FROM tbl_admins'), (err, result, fields) => { if (err) { return reject(err); } let foundUser = false; result.map((element) => { if (element.Username == username) { foundUser = true; } }); return resolve(foundUser); }); }); } module.exports = { checkAdmin }; 👆 Primero devolvemos una Promesa. Luego nos quedamos dentro de la función de devolución de llamada de la llamada SQL. Si hay un error err rechazamos la Promesa. Si no hay ningún error, resolvemos la Promesa con un foundUser . Si encontramos el nombre de usuario deseado dentro de la tabla, foundUser será true , de lo contrario, será false .
Ahora tenga en cuenta que checkAdmin devuelve una Promesa ahora.
// Router Controller const Admin = require('./Admin'); app.post('/some-route-only-admins-can-use', (req, res) => { const username = req.body.username; Admin.checkAdmin(username) .then((isAdmin) => { if (isAdmin) { return res.status(200).send({ message: 'Access granted' }); } else { return res.status(401).send({ message: 'Access denied' }); } }) .catch((err) => { logger.error(err.message); }); });👆 Esto puede diferir de su código, pero con suerte debería darle la idea correcta.
El problema principal con su método checkAdmin original es que la llamada SQL es asíncrona. En su código, no espera a que termine, sino que devuelve instantáneamente admin , que en ese momento siempre será null . Y null == false .
No pienses demasiado en this . Normalmente no es necesario modificarlo o utilizarlo.