MongoDB开发Discord机器人余额查询报错:无@用户时查自身余额失败
Discord机器人余额查询命令修复方案
原代码存在的问题
- 引用未定义变量:无@用户进入else分支时,
member为undefined,此时访问member.id和member.guild.id会直接报错 - 异步操作未等待:
profileSchema.findOne是异步方法,未加await导致判断逻辑失效 - 变量未声明:else分支中直接使用
profileBalance,但未提前声明赋值 - 属性调用错误:
message.author.tag()是错误写法,tag是User对象的属性,无需加括号 - 命令匹配不精准:
match('!ponyo balance')会匹配所有包含该字符串的消息,比如!ponyo balance test也会触发,容易误判
修复后的代码
client.on('messageCreate', async message => { if (message.author.bot) return; // 精准匹配命令:!ponyo balance 或 !ponyo balance @用户 const balanceCommand = /^!ponyo balance(?:\s+<@!?\d+>)?$/i; if (!balanceCommand.test(message.content)) return; // 优先取提到的成员,没有则取消息发送者的GuildMember对象 const targetMember = message.mentions.members.first() || message.member; try { // 检查用户是否已有余额数据,异步操作需加await const existingProfile = await profileSchema.findOne({ memberId: targetMember.id, guildId: targetMember.guild.id }); // 若没有则创建,已有则直接使用(假设createBalance会返回现有数据或新创建的数据) const profileBalance = await balance.createBalance(targetMember); console.log(`查询用户 ${targetMember.id} 的余额:${profileBalance.coins}`); await message.reply(`${targetMember.user.tag} 有 ${profileBalance.coins} 枚金币!`); } catch (error) { console.error('余额查询出错:', error); await message.reply('查询余额时出现错误,请稍后再试!'); } })
关键修改说明
- 精准命令匹配:用正则
/^!ponyo balance(?:\s+<@!?\d+>)?$/i确保只匹配!ponyo balance或带@用户的格式,忽略其他无关消息 - 目标成员处理:用
targetMember统一处理两种情况,避免分支中重复逻辑,同时message.member是GuildMember对象,包含服务器信息,适合传递给createBalance - 异步操作处理:所有数据库操作加
await,确保逻辑顺序正确,同时用try-catch捕获异常,避免机器人崩溃 - 变量统一管理:用
targetMember和profileBalance统一变量,避免未定义错误 - 错误处理:新增异常捕获,出错时给用户提示并打印错误日志,便于排查问题
内容的提问来源于stack exchange,提问作者rat
相关产品推荐
相关产品推荐

