Discord机器人运行报Supplied roles is not a role错误问题问询
错误修复方案
错误根源
你收到的TypeError [INVALID_TYPE]错误核心原因是执行markedUser.roles.add(role)时,获取到的role变量为undefined,discord.js的角色操作方法无法识别非角色、雪花ID类型的入参。
需修改的核心点
1. 修正客户端意图配置
你当前缺少拉取服务器角色、成员列表的必要意图,同时高版本discord.js已废弃
ws字段包裹意图的写法,修改客户端初始化代码:const client = new Client({ intents: [ 'GUILDS', 'GUILD_MESSAGES', 'GUILD_PRESENCES', 'GUILD_VOICE_STATES', 'GUILD_MEMBERS', 'GUILD_ROLES', 'GUILD_MESSAGE_CONTENT' ] });同时需前往Discord开发者平台的机器人设置页,开启
Privileged Gateway Intents分类下的全部三个权限开关。2. 补全角色不存在的兜底逻辑
原代码仅在机器人首次加入服务器时创建角色,若机器人已在服务器内、未生成过对应角色,就会出现查找为空的问题,在
mark、unmark命令的角色查找逻辑后补充兜底:let role = msg.guild.roles.cache.find(role => role.name === "Donnies Target"); // 新增兜底逻辑 if (!role) { try { role = await msg.guild.roles.create({ name: 'Donnies Target', permissions: [] }); } catch (err) { console.error('角色创建失败', err); return msg.reply('无法找到或创建目标角色,请确认机器人拥有管理角色权限,且自身角色层级高于待分配角色'); } }3. 补全异步操作的等待与错误捕获
roles.add、roles.remove均为异步方法,原代码未做等待与错误捕获,容易触发未捕获异常,修改操作代码:// mark命令修改 try { await markedUser.roles.add(role); } catch (err) { console.error('添加角色失败', err); return msg.reply('无法为用户添加标记角色,请检查机器人权限'); } // unmark命令同步修改remove操作为await+try catch结构4. 高版本discord.js兼容修改
如果你使用的是v14及以上版本的discord.js,还需做两处兼容修改:
- 原
message事件替换为messageCreate事件 - 原
msg.member.hasPermission("MANAGE_CHANNELS")替换为msg.member.permissions.has("ManageChannels")
- 原
额外注意事项
- 需确保机器人在服务器中的角色层级高于
Donnies Target角色,否则无法完成角色分配操作 - 需给机器人授予管理角色、连接语音频道的相关权限,否则对应功能会触发权限报错
内容的提问来源于stack exchange,提问作者Christopher
相关产品推荐
相关产品推荐

