discord.js报错INVALID_TYPE:提供的参数既不是用户也不是角色
解决方法
问题根因
该报错是discord.js处理频道创建的权限覆写参数时,无法识别传入的实体类型,或使用了已废弃的API参数导致的。
修复步骤
- 修正权限覆写的ID取值:
id字段需要传入字符串格式的用户/角色ID,不能直接传入Role或User对象,你当前代码里直接传入button.guild.roles.everyone对象,没有取ID属性是核心报错原因。 - 修正频道创建参数:discord.js v13及以上版本,父分类参数名为
parent,不是parent_id;v14版本频道类型需要使用ChannelType枚举,不能用字符串"text"。 - 权限枚举适配:v14版本权限字符串改为小驼峰格式,不再使用大写下划线分隔的格式。
- 可选优化:权限覆写项可以明确添加
type字段,0代表角色,1代表成员,进一步避免类型识别错误。
修正后代码示例
discord.js v13版本
button.guild.channels.create('cs', { type: "GUILD_TEXT", parent: '802172599836213258', permissionOverwrites: [ { id: button.guild.roles.everyone.id, deny: ['VIEW_CHANNEL', 'SEND_MESSAGES', 'READ_MESSAGE_HISTORY'] }, { // 原生按钮交互的触发用户ID用button.user.id,如确认使用的clicker对象取值正确可保留原写法 id: button.user.id, allow: ['VIEW_CHANNEL', 'SEND_MESSAGES', 'READ_MESSAGE_HISTORY'] } ] })
discord.js v14版本
const { ChannelType } = require('discord.js'); button.guild.channels.create('cs', { type: ChannelType.GuildText, parent: '802172599836213258', permissionOverwrites: [ { id: button.guild.roles.everyone.id, deny: ['ViewChannel', 'SendMessages', 'ReadMessageHistory'], type: 0 }, { id: button.user.id, allow: ['ViewChannel', 'SendMessages', 'ReadMessageHistory'], type: 1 } ] })
额外注意
如果你当前使用的是第三方discord-buttons插件实现按钮交互,该插件早已停止维护,与新版discord.js存在大量兼容问题,建议替换为discord.js原生的按钮交互体系。
内容的提问来源于stack exchange,提问作者Miskakao
相关产品推荐
相关产品推荐

