SQL 结果长度,搜索时不显示任何内容

Posted

技术标签:

【中文标题】SQL 结果长度,搜索时不显示任何内容【英文标题】:SQL result lengths and showing nothing when searched 【发布时间】: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 连接、发送和接收数据 【参考方案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);

【讨论】:

以上是关于SQL 结果长度,搜索时不显示任何内容的主要内容,如果未能解决你的问题,请参考以下文章

iOS UITableView 搜索时不重新加载数据

jQuery UI 自动完成 - 输入与结果集不匹配时不显示结果

sqlplus“显示参数”结果列如何在glogin.sql为空时不包装

调试时不显示任何内容[重复]

Drupal 视图 - 当视图没有结果时不显示任何公开的过滤器选项

iOS iPhone 运行时不显示任何内容