繁体   English   中英

如何在 function 中设置变量?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM