Discord.js结合SQLite查询用户XP排名返回[object Object]问题求助
问题修复方案
问题根源
你遇到的[object Object]输出有两个核心原因:
- better-sqlite3的
get()方法返回的始终是结果行对象,哪怕你只查询一个count统计值,也需要从对象中取出对应字段才能拿到数字,直接把对象转字符串就会输出[object Object] - 你在调用
get()时没有传入@curxp和@guild对应的参数值,查询条件不生效,就算取值也会得到错误结果
修复代码
你可以直接替换原来的排名查询逻辑:
if (message.content.startsWith(prefix + "cl stats")) { const curxp = score.points; const currentGuildId = message.guild.id; // 给count(*)加别名方便取值,同时传入参数执行查询 const rankQueryRes = sql.prepare(` SELECT count(*) AS user_rank FROM scores WHERE points >= ? AND guild = ? `).get(curxp, currentGuildId); // 从结果对象中取出排名数值 const finalRank = rankQueryRes.user_rank; console.log(finalRank); await message.reply(`你的当前服务器排名为:${finalRank}`); }
如果你习惯用命名参数的写法,也可以用下面的版本:
if (message.content.startsWith(prefix + "cl stats")) { const curxp = score.points; const currentGuildId = message.guild.id; const rankQueryRes = sql.prepare(` SELECT count(*) AS user_rank FROM scores WHERE points >= @curxp AND guild = @guild `).get({ curxp: curxp, guild: currentGuildId }); const finalRank = rankQueryRes.user_rank; console.log(finalRank); await message.reply(`你的当前服务器排名为:${finalRank}`); }
补充说明
当前的查询逻辑计算的是并列排名:如果有其他用户和你XP数值相同,你们的排名会一致。如果需要实现不并列的排名(同分按加入时间/用户ID排序),可以在WHERE条件后额外加排序规则即可。
内容的提问来源于stack exchange,提问作者Theoph
相关产品推荐
相关产品推荐

