mysql - 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!")
}
})
解决方案
解释:
正如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);
推荐阅读
- php - 防止 Laravel 中同时发生模型突变的最佳方法
- .net - 实体框架返回一个字段
- wordpress - 在 Wordpress REST API 中按菜单顺序排序?
- docusignapi - 收件人视图未合并
- mongodb - 将 Docker 用于 MEAN 堆栈应用程序:ERR_EMPTY_RESPONSE
- scada - 为什么dnp3源地址是65520而不是65536?
- asp.net-mvc - Visual Studio 2013:未加载任何符号
- regex - 文本文件的正则表达式查询未找到任何匹配项
- java - Is-a 和 Has-a 映射外键的问题
- php - 如何用 PHP 显示 blob?