如何修复TypeError [INVALID_TYPE]: 提供的参数既不是用户也不是角色
Discord.js 创建角色后设置频道权限报错修复方案
问题根因
GuildRoleManager.create() 是异步API,返回Promise对象,原代码没有等待角色创建完成就立刻从缓存中查找角色,此时Discord服务端还没返回角色创建结果,角色未写入本地缓存,所以owner变量实际为undefined,传入权限配置的id字段时不符合参数要求,直接抛出类型错误。
修复方案
直接等待角色创建接口返回,拿到创建完成的角色对象后再执行频道创建逻辑,无需额外查缓存。
方案1:async/await写法(更易读,推荐)
首先将你当前代码所属的外层函数声明为异步函数,比如消息事件回调修改为async (message) => { ... },再调整内部逻辑:
if (id === '4') { // 等待角色创建完成,直接获取返回的角色实例 const owner = await message.guild.roles.create({ name: `Owner`, color: color.white, permissions: ['ADD_REACTIONS'], hoist: true, }); const name = names.name; await message.guild.channels.create(name, { type: 'GUILD_TEXT', permissionOverwrites: [ { id: owner.id, // 传入角色ID allow: ['ADD_REACTIONS'], deny: ['VIEW_CHANNEL'], }, // 可选:添加全体成员默认权限配置,避免频道权限异常 { id: message.guild.roles.everyone.id, deny: ['VIEW_CHANNEL'] } ], }).catch(err => console.log(err)); }
方案2:Promise链式写法(无需修改外层函数)
if (id === '4') { message.guild.roles.create({ name: `Owner`, color: color.white, permissions: ['ADD_REACTIONS'], hoist: true, }) // 角色创建完成后再执行频道创建逻辑 .then(owner => { const name = names.name; return message.guild.channels.create(name, { type: 'GUILD_TEXT', permissionOverwrites: [ { id: owner.id, allow: ['ADD_REACTIONS'], deny: ['VIEW_CHANNEL'], }, { id: message.guild.roles.everyone.id, deny: ['VIEW_CHANNEL'] } ], }); }) .catch(err => console.log(err)); }
内容的提问来源于stack exchange,提问作者Spooky Hmm
相关产品推荐
相关产品推荐

