首页 > 解决方案 > 如何在函数中设置变量?

问题描述

得到这个功能来检查用户名是否是管理员。

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”。该函数返回“”。

谢谢

标签: javascriptnode.jsexpressvariables

解决方案


我情不自禁地注意到你的整个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太多。您通常不需要更改或使用它。


推荐阅读