【问题标题】:NodeJs async sql to variableNodeJs异步sql到变量
【发布时间】:2017-08-04 20:36:56
【问题描述】:

我想要这样的结果 var rolecheck = ['289773584216358912','281531832938266625'];

仅从数据库中获取,因此我可以将它与另一个具有 ID 的数组进行比较(是的,它应该是一个字符串)

这样做的目的是在执行命令之前检查用户是否具有具有该角色权限的特定角色。所以它需要是一个可以调用的函数。

我从未使用过 NodeJs 异步函数,所以我不知道如何将此 sql 转换为数组:

.then 的内容只是我试图找出它是如何工作的一些代码,所以忽略控制台日志等。注意:日志确实返回正确的角色,但我只需要它们返回它们以使用它们在我的比较功能中。

sql.all("SELECT roleId FROM roles WHERE punish = 'true' and guildId = '"+guildids+"'").then(row => {
        if (row) {
            var rolecheck = [];
            row.forEach(function(row){
                rolecheck.push(row.roleId);
            });
            console.log(rolecheck);
        }
    });

返回不起作用,所以我需要一个解决方法。

这是我比较它的地方:(只要正确定义了 rolecheck 和 role.id,它就可以正常工作,但事实并非如此。当我对 rolecheck 数组进行硬编码时,它确实有效。

member.forEach(function(role){
  if(HasRole(rolecheck, role.id)){
      console.log('user has role: '+role.name);
      return true;
    }
});

【问题讨论】:

  • 这是异步的。您不能从.then 处理程序返回,因为在.then 触发时,外部函数的上下文不再存在。您必须在.then 处理程序内部 进行检查。换句话说,您的代码必须以嵌套方式编写。
  • 我害怕那个。 .then 没有替代方案吗?
  • 嗯,你真的不必以“嵌套”的方式做事。假设您之前的 .then() 返回一个承诺对象,您始终可以链接 .then() 调用。但这完全取决于这个sql 对象是如何实现的。
  • 我一直在挖掘一点点,并遇到了回调。你知道吗?

标签: node.js sqlite asynchronous


【解决方案1】:

如果您可以使用支持 async/await 的节点版本,例如版本 7,这里是一种以同步方式编写基于 Promise 的代码的方法。这使得传递行值变得更简单。

async function myFunction () {
  try {
    let member = ''; // whatever member should be

    let row = await sql.all("SELECT roleId FROM roles WHERE punish = 'true' and guildId = '"+guildids+"'");

    // now you have the row available, outside of 'then' blocks

    var rolecheck = [];

    if (row) {
      row.forEach(function(row){
        rolecheck.push(row.roleId);
      });
      console.log(rolecheck);
    }

    member.forEach(function(role){
      if (HasRole(rolecheck, role.id)) {
        console.log('user has role: '+role.name);
        return true;
      }
    });

  } catch (error) {
    consol.log(error.stack);
  }
}

如果 sql.all 没有返回一个 Promise,你可以做类似这样的事情,这也适用于基于回调的函数

async function myFunction () {
  try {

    let row = await runSql();

    // everything else same as first example above
}

async function runSql () {
  try {
    return new Promise(function (resolve, reject) {
      sql.all("SELECT roleId FROM roles WHERE punish = 'true' and guildId = '"+guildids+"'")
      .then(row => {
        if (row) {
          var rolecheck = [];
          row.forEach(function(row){
              rolecheck.push(row.roleId);
          });
          console.log(rolecheck);
          resolve(row);
        } else {
          reject('Row not found');
        }
      });
    });
  } catch (error) {
    console.log('erro')
  }
};

【讨论】:

    猜你喜欢
    • 2013-04-29
    • 2019-06-14
    • 2017-02-10
    • 2013-08-01
    • 2016-05-26
    • 2015-10-08
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    相关资源
    最近更新 更多