Discord.js v13斜杠命令mute功能报TypeError无法读取undefined的cache属性如何解决
报错原因
你遇到的TypeError: Cannot read properties of undefined (reading 'cache')错误由两个代码问题共同导致:
- 你使用
interaction.options.getUser("miembro")获取到的是全局User类型对象,该对象仅存储用户的通用公开信息,没有服务器角色相关的roles属性,访问target.roles直接返回undefined,读取cache属性就会抛出报错。 - 就算你获取到正确的服务器成员对象,调用
roles.cache.add也是错误用法:cache是角色数据的只读缓存集合,添加角色的方法直接挂载在roles管理器上,不需要经过cache。
修复方案
核心修改点
- 将目标用户的获取方式改为获取服务器成员对象:
const target = interaction.options.getMember("miembro"); - 替换添加角色的写法:
await target.roles.add("902652079762468975"); - 补充斜杠命令的预响应处理,避免3秒超时导致的交互失效,在逻辑执行前先调用
await interaction.deferReply()。
额外补充的必要校验
为了避免后续出现权限类运行错误,建议增加如下校验逻辑:
- 校验命令发起者是否拥有「管理成员」权限,普通用户不能调用静音命令
- 校验Bot自身是否拥有「管理角色」权限,没有权限无法给用户加角色
- 校验目标用户的角色等级低于发起者和Bot,避免无法操作管理员/高阶角色用户
- 确认静音角色的位置在Bot的角色等级下方,Discord不允许给用户添加比自身等级更高的角色
完整修复后代码
const { SlashCommandBuilder } = require("@discordjs/builders") const { MessageEmbed, Permissions } = require("discord.js") module.exports = { data: new SlashCommandBuilder() .setName("mute") .setDescription("静音指定服务器用户") .addUserOption(option => option .setName("miembro") // 目标用户 .setDescription("选择你要静音的服务器成员") .setRequired(true) ) .addStringOption(option => option .setName("razon") // 静音原因 .setDescription("填写静音该用户的原因") .setRequired(true) ), async run(client, interaction){ // 预响应避免交互超时 await interaction.deferReply(); const target = interaction.options.getMember("miembro"); const reason = interaction.options.getString("razon"); const muteRoleId = '902652079762468975'; // 校验发起者权限 if(!interaction.member.permissions.has(Permissions.FLAGS.MODERATE_MEMBERS)) { return interaction.followUp({ embeds: [new MessageEmbed().setColor("RED").setDescription("你没有管理成员的权限,无法使用静音命令")]}) } // 校验Bot权限 if(!interaction.guild.me.permissions.has(Permissions.FLAGS.MANAGE_ROLES)) { return interaction.followUp({ embeds: [new MessageEmbed().setColor("RED").setDescription("Bot没有管理角色的权限,无法执行静音操作")]}) } // 校验静音角色是否存在 const muteRole = interaction.guild.roles.cache.get(muteRoleId); if(!muteRole) { return interaction.followUp({ embeds: [new MessageEmbed().setColor("RED").setDescription("服务器未配置静音角色")]}) } // 校验目标用户可操作 if(target.permissions.has(Permissions.FLAGS.ADMINISTRATOR) || target.roles.highest.position >= interaction.member.roles.highest.position) { return interaction.followUp({ embeds: [new MessageEmbed().setColor("RED").setDescription("你无法静音权限高于或等于你的用户")]}) } if(target.roles.highest.position >= interaction.guild.me.roles.highest.position) { return interaction.followUp({ embeds: [new MessageEmbed().setColor("RED").setDescription("Bot无法静音权限高于自身的用户")]}) } // 执行静音 await target.roles.add(muteRoleId, reason); interaction.followUp({ embeds: [new MessageEmbed().setColor("GREEN").setDescription(`✅ ${target} 已被静音,原因:${reason}`)]}) } }
内容的提问来源于stack exchange,提问作者Negrura
相关产品推荐
相关产品推荐

