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

Discord.js给用户添加角色时报Cannot read property 'cache'错误如何解决

报错原因
  • 核心错误是你获取到的是全局User对象而非服务器内的GuildMember对象:Discord的User类代表全局平台用户,不携带单个服务器的成员身份、角色等数据,没有roles属性,所以访问mention.roles返回undefined,调用undefined.cache就触发了本次报错。
  • 你错误调用了message.mentions.users.first()获取提及对象,正确的成员获取方法应该是message.mentions.members.first(),和你参考的示例代码保持一致。
  • 补充:client.users.get(args[0])拿到的同样是User对象,且discord.js v12及以上版本所有缓存数据都需要通过.cache访问,该方法已失效。
修复步骤
  1. 替换提及对象的获取逻辑,改为获取服务器成员对象,同时增加非空校验避免无效参数报错
  2. 所有涉及操作角色的逻辑,全部改用GuildMember对象调用
  3. 兼容新版本discord.js的缓存访问规则
修复后完整代码
if (message.member.roles.cache.some(role => role.name === "Co-Owner" || role.name === "Operator")) {
    if (command == "birthday") {
      // 改为获取服务器成员对象,增加非空校验
      const member = message.mentions.members.first() || message.guild.members.cache.get(args[0]);
      if (!member) return message.reply("请@要操作的用户或输入正确的用户ID");
      
      const role = message.guild.roles.cache.find(role => role.name === "BIRTHDAY POG");
      if (!role) return message.reply("未找到BIRTHDAY POG身份组");

      if (member.roles.cache.some(role => role.name === "BIRTHDAY POG")) {
        message.reply("该用户已拥有该身份组,现在将其移除");
        member.roles.remove(role);
      } else {
        member.roles.add(role);
        message.reply(`已为\`${member.user.username}\`添加身份组`);
        client.guilds.cache.get('731368965963513936').channels.cache.get('778124805135663104').send(`${message.author.username} 对 ${member.user.username} 使用了birthday指令`);
        message.reply("再次对该用户执行相同指令即可移除身份组");
      }
    }
  }
补充注意事项
  • 如果你使用discord.js v13及以上版本,需要在开发者后台开启SERVER MEMBERS INTENT,同时初始化客户端时声明GUILDS、GUILD_MEMBERS、GUILD_MESSAGES意图,否则无法正常获取服务器成员数据。
  • 你参考的示例中message.author.roles.add(role)同样存在错误,message.author是User对象,要给自己加角色需要调用message.member.roles.add(role)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:18:02