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

Discord.js创建频道报错:Supplied parameter is not a User nor a Role

解决Discord机器人创建频道时的INVALID_TYPE错误

问题描述

Discord机器人此前运行正常,上周开始通过按钮交互创建频道时触发错误:TypeError [INVALID_TYPE]: Supplied parameter is not a User nor a Role。相同代码在测试机器人上可正常运行,已排查19位雪花ID、重置机器人token等方案,均未解决问题。机器人未触发rate limited。

相关代码片段

switch (customId) {
  case 'VERIFY':
    await interaction.guild.channels.create(`${customId + "-" + ID}`, {
        type: "GUILD_TEXT",
        parent: verifyParent,
        permissionOverwrites: [
          {
            id: interaction.member.id,
            allow: [ "SEND_MESSAGES", "VIEW_CHANNEL", "READ_MESSAGE_HISTORY" ]
          },
          {
            id: staff1,
            allow: [ "SEND_MESSAGES", "VIEW_CHANNEL", "READ_MESSAGE_HISTORY" ]
          },
          {
            id: staff2,
            allow: [ "SEND_MESSAGES", "VIEW_CHANNEL", "READ_MESSAGE_HISTORY" ]
          },
          {
            id: everyone,
            deny: [ "SEND_MESSAGES", "VIEW_CHANNEL", "READ_MESSAGE_HISTORY" ]
          }
        ]
    })
    .then(async(channel) => {
        channel.send(`${ID} Please send the details.`);
    })
    .catch(console.log);
}

错误栈信息

TypeError [INVALID_TYPE]: Supplied parameter is not a User nor a Role.
    at PermissionOverwrites.resolve (/home/runner/cum-bot/node_modules/discord.js/src/structures/PermissionOverwrites.js:184:28)
    at /home/runner/cum-bot/node_modules/discord.js/src/managers/GuildChannelManager.js:145:81
    at Array.map (<anonymous>)
    at GuildChannelManager.create (/home/runner/cum-bot/node_modules/discord.js/src/managers/GuildChannelManager.js:145:51)
    at Client.<anonymous> (/home/runner/cum-bot/index.js:120:48)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {
        [Symbol(code)]: 'INVALID_TYPE'
    }

解决方案

这个错误是因为permissionOverwrites数组中的某个id对应的不是有效的用户、角色或@everyone标识符,导致discord.js无法解析权限覆盖对象。按以下步骤排查修复:

  • 检查变量取值有效性
    确认staff1、staff2、everyone变量存储的是正确的19位雪花ID字符串,且在当前运行的服务器中存在对应的角色/用户:

    • everyone不要手动输入ID,直接用interaction.guild.roles.everyone.id,避免服务器差异导致ID不匹配
    • 打印staff1、staff2的实际值,确认它们对应服务器中存在的角色
  • 添加前置验证逻辑
    在创建频道前先验证权限覆盖的目标是否存在,避免无效ID传入:

    // 获取@everyone角色
    const everyoneRole = interaction.guild.roles.everyone;
    // 检查staff角色是否存在
    const staff1Role = interaction.guild.roles.cache.get(staff1);
    const staff2Role = interaction.guild.roles.cache.get(staff2);
    
    if (!staff1Role || !staff2Role) {
      return interaction.reply('无法找到指定的工作人员角色,请检查配置');
    }
    
    // 使用验证后的角色ID构建权限覆盖
    const permissionOverwrites = [
      { id: interaction.member.id, allow: ["SEND_MESSAGES", "VIEW_CHANNEL", "READ_MESSAGE_HISTORY"] },
      { id: staff1Role.id, allow: ["SEND_MESSAGES", "VIEW_CHANNEL", "READ_MESSAGE_HISTORY"] },
      { id: staff2Role.id, allow: ["SEND_MESSAGES", "VIEW_CHANNEL", "READ_MESSAGE_HISTORY"] },
      { id: everyoneRole.id, deny: ["SEND_MESSAGES", "VIEW_CHANNEL", "READ_MESSAGE_HISTORY"] }
    ];
    
  • 对齐discord.js版本
    测试机器人和生产机器人的discord.js版本可能存在差异,某些版本对权限覆盖的解析逻辑有变化。执行npm list discord.js对比两个环境的版本,升级或降级到一致版本尝试修复。

  • 确认机器人服务器权限
    确保生产机器人在目标服务器中拥有Manage Channels和Manage Roles权限,避免因权限不足导致角色/用户信息无法正常获取。

内容的提问来源于stack exchange,提问作者Debaloy Chatterjee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 01:24:29