首页 > 解决方案 > SQL 结果长度,搜索时不显示任何内容

问题描述

我希望我的 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!")
    }
})

标签: mysqlsqlnode.jsdiscord.js

解决方案


解释:

正如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)并等待调用。

这是一个示例设置:

// 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);

推荐阅读