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访问,该方法已失效。
修复步骤
- 替换提及对象的获取逻辑,改为获取服务器成员对象,同时增加非空校验避免无效参数报错
- 所有涉及操作角色的逻辑,全部改用GuildMember对象调用
- 兼容新版本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
相关产品推荐
相关产品推荐

