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
相关产品推荐
相关产品推荐

