Discord.js V13权限覆盖报错INVALID_TYPE,求技术协助
问题分析与修复方案
错误根源
你遇到的INVALID_TYPE错误,并非Discord.js v13版本本身的问题,而是permissionOverwrites的配置格式不符合v13的严格要求:每个权限覆盖项必须明确指定是用户(member)还是角色(role),或者直接传入User/Role实例。你的代码存在两处不符合要求的地方:
- 第一个权限项中,你将
client.users.cache.get(chan.topic)返回的User对象赋值给了id字段——id需要的是字符串格式的ID,而非对象。 - 第三个权限项中,你使用了角色ID字符串,但未指定
type: 'role',Discord.js无法识别这是角色还是用户ID。
修正后的代码示例
写法1:使用ID字符串+明确类型
// 先获取目标用户(需判断用户是否存在于缓存) const targetUser = client.users.cache.get(chan.topic); if (!targetUser) { console.error('目标用户不在缓存中'); return; } chan.edit({ name: `closed-${chan.name}`, permissionOverwrites: [ { id: targetUser.id, type: 'member', deny: ['SEND_MESSAGES', 'VIEW_CHANNEL'], }, { id: interaction.guild.roles.everyone.id, type: 'role', deny: ['VIEW_CHANNEL'], }, { id: client.config.roleSupport, type: 'role', allow: ['SEND_MESSAGES', 'VIEW_CHANNEL'], }, ], });
写法2:直接传入User/Role实例(更简洁)
const targetUser = client.users.cache.get(chan.topic); const everyoneRole = interaction.guild.roles.everyone; // 从服务器缓存中获取支持角色(提前验证角色是否存在) const supportRole = interaction.guild.roles.cache.get(client.config.roleSupport); if (!targetUser || !supportRole) { console.error('用户或支持角色不存在'); return; } chan.edit({ name: `closed-${chan.name}`, permissionOverwrites: [ { ...targetUser, deny: ['SEND_MESSAGES', 'VIEW_CHANNEL'], }, { ...everyoneRole, deny: ['VIEW_CHANNEL'], }, { ...supportRole, allow: ['SEND_MESSAGES', 'VIEW_CHANNEL'], }, ], });
额外注意事项
- 确保
chan.topic存储的是有效的用户ID字符串,否则client.users.cache.get()会返回undefined,引发新的错误。 - 对于角色,建议从服务器角色缓存中获取实例,而非直接使用配置中的ID,这样能提前验证角色是否存在。
内容的提问来源于stack exchange,提问作者Sven Bledt
相关产品推荐
相关产品推荐

