[英]How can I write a function that will set the value of a variable inside a parent object?
[英]How can I set a variable inside a function?
得到这个 function 来检查用户名是否是管理员。
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 function 里面设置变量“admin”。function 返回“”。
谢谢
我忍不住注意到你的整个checkAdmin
function 有一种我以前从未见过的风格。 让我试着简化一下,也许它有助于解决这个问题。
// 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 调用的回调 function 中。 如果有错误err
我们拒绝 Promise。如果没有错误我们用 boolean foundUser 解析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
。 您通常不需要更改或使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.