You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 07:15:00