如何将MySQL查询结果填入discord.js的embed消息对应字段
解决方案
核心逻辑是在info命令触发时先执行数据库查询,拿到统计结果后再构建并发送embed消息,代码修改如下:
第一步:建议先将单连接替换为连接池(稳定性更高,避免连接断开导致查询失败)
把原来的连接创建代码替换为:
const mysql = require('mysql'); // 创建连接池 const pool = mysql.createPool({ host : 'private', port : 'private', user : 'private', password : 'private', database : 'private', charset : 'private', connectionLimit: 10 // 按需调整连接数上限 });
第二步:修改info命令处理逻辑
if(message.content.startsWith(prefix + 'info')) { // 先执行数据库查询,此处假设你的玩家表名为players,性别字段为gender,存储值对应为male、female、little_girl,可根据实际业务修改 const querySql = ` SELECT COUNT(IF(gender = 'male', 1, NULL)) AS male_count, COUNT(IF(gender = 'female', 1, NULL)) AS female_count, COUNT(IF(gender = 'little_girl', 1, NULL)) AS girl_count, COUNT(*) AS total_players FROM players `; pool.query(querySql, (error, results) => { // 查询错误处理 if (error) { return message.channel.send('查询数据失败,请稍后重试'); } const data = results[0]; // 拿到查询结果后再构建embed const sembed = new Discord.MessageEmbed() .setTitle('Info:') .setThumbnail('png') .setColor('GOLD') .addFields( {name: 'Players:', value: data.total_players.toString()}, {name: '👨🏻', value: data.male_count.toString(), inline: true}, {name: '👩🏻', value: data.female_count.toString(), inline: true}, {name: '👧🏻', value: data.girl_count.toString(), inline: true}, ) .setTimestamp(); message.channel.send({embeds: [sembed]}); }) }
注意事项
- 上面的SQL语句里的表名、字段名、性别枚举值需要替换为你实际数据库的对应配置
- 如果你仍然要使用原来的单连接写法,把
pool.query替换为connection.query即可,但是单连接长期运行容易出现断开问题,更推荐使用连接池 - 因为数据库查询是异步操作,必须把embed的构建和发送逻辑写在查询回调内部,否则会出现还没拿到数据就已经发送了embed的问题
内容的提问来源于stack exchange,提问作者I need Help
相关产品推荐
相关产品推荐

