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

创建静音角色后分配失败的TypeError [INVALID_TYPE]问题求助

解决Discord机器人分配muted角色的TypeError问题

嘿,这个问题我熟!你遇到的INVALID_TYPE错误,核心原因是你没有正确处理异步操作——message.guild.roles.create()是一个异步方法,它返回的是一个Promise对象,而不是直接的Role实例。你直接用muterole.id的时候,muterole还只是个未解析的Promise,自然不符合Discord.js要求的Role/Snowflake类型。

下面给你两种修复方案:

方案1:使用async/await(更简洁易读)

把你的命令处理函数改成async函数,然后用await等待角色创建完成:

// 注意要把外层函数标记为async
async function yourCommandHandler(message) {
  try {
    // 用await等待角色创建完成,得到真正的Role实例
    const muterole = await message.guild.roles.create({ 
      data: { 
        name: 'muted', 
        color: 'BLUE', 
        permissions: [0] 
      } 
    });
    // 现在可以安全地添加角色了
    await message.mentions.members.first().roles.add(muterole);
  } catch(err) {
    console.log(err);
    message.channel.send("An error occured logs were sent to the dev");
  }
}

方案2:使用Promise.then()(适合无法用async的场景)

如果你没法把外层函数改成async,就用.then()来处理Promise的解析结果:

message.guild.roles.create({ 
  data: { 
    name: 'muted', 
    color: 'BLUE', 
    permissions: [0] 
  } 
}).then(muterole => {
  // 在then回调里拿到创建好的Role实例,再执行添加操作
  message.mentions.members.first().roles.add(muterole);
}).catch(err => {
  console.log(err);
  message.channel.send("An error occured logs were sent to the dev");
});

另外还有两个小建议:

  • 最好先检查message.mentions.members.first()是否存在,避免用户没@人的时候触发额外错误
  • 权限设置permissions: [0]可以写成permissions: []或者permissions: 0,效果一致且更清晰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 16:42:53