如何将MySQL查询结果读取到Discord机器人Embed消息并处理无结果场景
实现方案
核心逻辑说明
你需要将数据库查询逻辑嵌入到Discord消息事件的回调中,从用户发送的指令里提取查询参数,拿到数据库返回结果后再动态生成Embed卡片,同时增加空结果判断分支。
完整可运行代码
如果继续使用原生mysql回调写法,代码如下:
const mysql = require('mysql'); const { MessageEmbed } = require('discord.js'); // 数据库连接配置保持不变 const con = mysql.createConnection({ host: "localhost", user: "root", password: "", database: "mydb" }); // 预先建立数据库连接,避免每次查询重复连接 con.connect(err => { if (err) throw err; console.log("数据库连接成功"); }); const prefix = '!'; // 替换成你自己的指令前缀 client.on('message', message => { // 忽略机器人自己发的消息 if (message.author.bot) return; // 匹配指令格式 可将'查询'替换为你需要的指令触发词 if (message.content.startsWith(prefix + '查询')) { // 提取用户输入的查询参数 const args = message.content.slice(prefix.length).trim().split(/ +/); const queryParam = args[1]; if (!queryParam) { return message.channel.send("请输入要查询的名称或ID"); } // 执行数据库参数化查询 const sql = 'SELECT * FROM customers WHERE name = ? OR id = ?'; con.query(sql, [queryParam, queryParam], function(err, result) { if (err) throw err; // 判断查询结果是否为空 if (result.length === 0) { return message.channel.send("未查询到匹配的用户信息"); } // 取第一条匹配结果 可在SQL末尾加LIMIT 1优化查询性能 const userData = result[0]; // 动态生成Embed卡片 const logo = ''; // 替换成你自己的logo地址 const embed = new MessageEmbed() .setTitle(`名称是: ${userData.name}`) .addField('用户ID', userData.id) // 可根据你的表字段继续添加其他展示项 .setThumbnail(logo); // 发送Embed message.channel.send({ embeds: [embed] }); }); } });
注意事项
- 如果你使用的是Discord.js v13及以上版本,需要将
message事件替换为messageCreate事件,发送Embed的写法保持不变 - 可以将
mysql包替换为mysql2/promise,用async/await写法替代回调,代码可读性更高 - 建议给数据库查询增加超时和异常捕获处理,避免数据库异常导致机器人崩溃
内容的提问来源于stack exchange,提问作者Kfir Ben SHimon
相关产品推荐
相关产品推荐

