【问题标题】:SQL result lengths and showing nothing when searchedSQL 结果长度,搜索时不显示任何内容
【发布时间】:2019-11-07 19:55:14
【问题描述】:

我希望我的 Discord 机器人检查加入的用户是否存在于 MySQL 表中。但是,当它发送查询时,它基本上告诉我它不存在,即使它应该存在。

这是我当前的代码:

bot.on('guildMemberAdd', async (member) => {
    console.log(member.id)

    let query = `SELECT userId FROM QR5PVGPh1D.users WHERE userId = '${member.id}'`

    let result = connection.query(query)

    if(result.length > 0){
        console.log("It works!")
    }
})

【问题讨论】:

  • 澄清一下,您是直接使用sql 包吗?
  • @slothiful 我正在使用mysql 连接、发送和接收数据

标签: mysql sql node.js discord.js


【解决方案1】:

节点是异步的,所以在这里你尝试在它被填充之前 console.log 结果... 您可以在此处找到更多信息:

Node JS MySQL query function not returning result

How do I return callback of MySQL query and push to an array in Node.js?

这是带有回调函数的代码。试试吧,它应该可以工作:

let query = `SELECT userId FROM QR5PVGPh1D.users WHERE userId = '${member.id}'`
connection.query(query, function (err, result) {
  if (!err) {
    if (result.length > 0) {
      console.log("It works!")
    }
  }
});

【讨论】:

    【解决方案2】:

    说明:

    正如BadSpencer 所述,mysql 驱动程序是异步的,并且基于回调。

    假设您打算接您的朋友去参加体育赛事。你不确定他们希望你什么时候来,所以你给他们打电话问他们。他们想了一会儿,然后告诉你一个时间。你得到了你要求的信息,所以你挂断了。在编程术语中,这将是同步代码的示例(有时被认为是 Node.js 中的“正常”代码)。

    让自己回到同样的境地。然而,当你这次打电话给你的朋友时,他们很忙。你不想打扰他们,所以你让他们稍后给你打电话。你挂断了,但现在你等着。一个小时后,他们给你回电话,告诉你时间。这就是异步代码的思考过程。

    屏幕后面还有很多内容,但为简单起见,我不会在这个答案中用所有这些信息轰炸你。

    解决方案:

    您应该传递一个函数作为回调函数,该回调函数将使用返回的数据。考虑这个例子:

    let query = `SELECT userId FROM QR5PVGPh1D.users WHERE userId = '${member.id}'`;
    
    // Passing the callback function as the second parameter.
    connection.query(query, (err, result) => {
      if (err) return console.error(err);
    
      if (result.length > 0) console.log('It works (it actually does).');
    });
    

    但是,由于结果的范围和代码的后续流程,这种基于回调的性质可能会成为一场噩梦。几次查询后,您的代码可能会变得混乱。为防止这种情况,您可以将查询包装在您自己的 Promise(或使用基于 Promise 的 mysql 包,如 promise-mysql)和 await 调用中。

    这是一个示例设置:

    // Defining 'connection' as a parameter so
    // you can export this function and use it
    // anywhere.
    function query(connection, sql) {
      return new Promise((resolve, reject) => {
    
        connection.query(sql, (err, result) => {
          if (err) reject(err);
          else resolve(result);
        });
    
      });
    }
    
    // Asynchronous context needed for 'await' (this needs to be within an async function).
    
    let query = `SELECT userId FROM QR5PVGPh1D.users WHERE userId = '${member.id}'`;
    
    let result = await query(connection, query)
      .catch(console.error);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-12
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多