有這個功能來檢查用戶名是否是管理員。
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”。該函式回傳“”。
謝謝
uj5u.com熱心網友回復:
我不禁注意到您的整個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);
});
});
?? 這可能與你的代碼不同,但它應該會給你正確的想法。
你的代碼有問題
The main issue with your original checkAdmin method is that the SQL call is asynchronous. In your code you don't wait for it to finish, but you instantly return admin which at that point will always be null. And null == false.
Don't think about this too much. You normally don't need to alter it or use it.
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/320789.html
標籤:javascript 节点.js 表达 变量
上一篇:計算機基礎知識(自我的理解)
下一篇:如何洗掉R中名稱為日期的一些變數
