Discord机器人/remove命令报错:Cannot read properties of undefined (reading 'edit')
解决Discord.js中/remove命令权限修改报错及逻辑问题
问题根源分析
- 频道对象获取错误:你把
interaction.channel.id赋值给了channel,这只是字符串形式的频道ID,不是频道对象,自然没有permissionOverwrites.edit方法——这就是报错TypeError: Cannot read properties of undefined (reading 'edit')的直接原因。 - 用户参数类型错误:用
addStringOption接收@用户是不合理的,Discord.js提供了专门的addUserOption来处理用户提及,用字符串选项拿到的是纯文本(可能是ID或@格式文本),无法直接调用user.id。 - 权限逻辑反向:你设置
ViewChannel: true是给用户添加查看权限,要移除权限应该设为false。 - 冗余的Guild获取:
interaction本身包含当前服务器的guild属性,不需要再通过client.guilds.cache.get重复获取。
修正后的代码
module.exports = { data: new SlashCommandBuilder() .setName('remove') .setDescription('移除用户查看当前工单频道的权限') .addUserOption(option => option .setName("user") .setDescription("请提及要移除权限的用户") .setRequired(true) ), async execute(interaction, client) { // 直接获取当前频道对象(而非ID) const channel = interaction.channel; // 通过UserOption获取完整用户对象 const user = interaction.options.getUser('user'); try { // 修改权限覆盖,移除用户的频道查看权限 await channel.permissionOverwrites.edit(user.id, { ViewChannel: false }); await interaction.reply(`已成功移除用户 ${user.tag} 的频道查看权限`); } catch (error) { console.error('修改权限时出错:', error); await interaction.reply({ content: '修改权限失败,请检查机器人是否拥有「管理频道」权限', ephemeral: true }); } }, };
额外注意事项
- 确保机器人拥有管理频道的服务器权限,否则无法修改频道权限覆盖规则。
- 可以给命令添加权限校验,只允许管理员使用:在
data部分添加.setDefaultMemberPermissions(PermissionFlagsBits.ManageChannels)(需提前引入PermissionFlagsBits)。
内容的提问来源于stack exchange,提问作者A_person
相关产品推荐
相关产品推荐

