javascript - 如何在函数中设置变量?
问题描述
得到这个功能来检查用户名是否是管理员。
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;
} }
这是在 Express 文件中。
var check = Admin.checkAdmin(req.body.username);
if (check == false) {
console.log("Wrong")
res.send({
message: 'Access denied'
}); //bad request
return;
}
SQL 是正确的。问题是在 SQL 函数中设置变量“admin”。该函数返回“”。
谢谢
解决方案
我情不自禁地注意到你的整个checkAdmin
函数具有我以前从未见过的风格。让我试着简化一下,也许它有助于解决这个问题。
// 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 };
首先我们返回一个 Promise。然后我们留在 SQL 调用的回调函数中。如果有错误err
,我们会拒绝 Promise。如果没有错误,我们使用 boolean 解决 Promise foundUser
。如果我们在表中找到想要的用户名foundUser
就会是true
,否则就是false
。
现在请记住,checkAdmin
现在返回一个 Promise。
// 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);
});
});
这可能与您的代码不同,但希望它能给您正确的想法。
你的代码有问题
原始方法的主要问题checkAdmin
是 SQL 调用是异步的。在您的代码中,您无需等待它完成,而是立即返回admin
,此时将始终为null
. 和null == false
。
不要想this
太多。您通常不需要更改或使用它。
推荐阅读
- powershell - PowerShell获取文件夹中没有路径和tsv行数的文件名
- python - 在 Django admin TabularInline 中替换“添加另一行”按钮的 href
- angular - ctx。在 Angular 中未定义
- reactjs - 两次通过数组的简单反应错误映射
- javascript - 检查数组中的所有值,如果不是字符串则返回 false
- python - 如何在 Django 中替换一个模型对象的一个字段?
- java - 如何使用 mockito 模拟 JavaFX 控件?
- discord.py - 打印用户总数
- aws-lambda - NestJS + Serverless / Lambda 上的任务调度 / CRON 作业
- javascript - React 功能组件中超出最大更新深度