You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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('查询余额时出现错误,请稍后再试!');
  }
})

关键修改说明

  1. 精准命令匹配:用正则/^!ponyo balance(?:\s+<@!?\d+>)?$/i确保只匹配!ponyo balance或带@用户的格式,忽略其他无关消息
  2. 目标成员处理:用targetMember统一处理两种情况,避免分支中重复逻辑,同时message.member是GuildMember对象,包含服务器信息,适合传递给createBalance
  3. 异步操作处理:所有数据库操作加await,确保逻辑顺序正确,同时用try-catch捕获异常,避免机器人崩溃
  4. 变量统一管理:用targetMember和profileBalance统一变量,避免未定义错误
  5. 错误处理:新增异常捕获,出错时给用户提示并打印错误日志,便于排查问题

内容的提问来源于stack exchange,提问作者rat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 01:09:26