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

如何修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:36:03