discord.js工单系统调用permissionOverwrites报非函数错误如何解决
错误原因
你遇到的报错是因为discord.js v13及以上版本中,频道对象的permissionOverwrites是权限覆写管理器实例,不是可直接调用的函数,你调用了不存在的方法导致执行失败。同时你的代码还存在数据读取逻辑错误:你在全局位置读取的subTicketSuporte取的是当前触发交互的用户ID,点击归档按钮的是管理员时,你读取到的不是工单创建者的ID,就算方法改对也会删错权限。
修复步骤
- 先调整工单创建逻辑,存储频道对应创建者ID
在你创建工单频道canalSuporte的代码块后,新增存储频道与创建者绑定关系的逻辑:
// 原有创建频道的代码不变 let canalSuporte = await interaction.guild.channels.create(/* 原有参数 */); // 新增:绑定频道ID和创建者ID到数据库 await db.ref(`Ticket/ChannelOwner/${canalSuporte.id}`).set({ userId: interaction.user.id });
- 替换归档逻辑中的错误权限修改代码
将archiveChannel分支里的错误代码替换为调用管理器的edit方法,同时正确读取当前频道对应的创建者ID:
if (interaction.customId === "archiveChannel") { let permicaoNecessaria = Permissions.FLAGS.BAN_MEMBERS; if (!interaction.member.permissions.has(permicaoNecessaria)) return interaction.followUp({ content: "Você não possui permissão para arquivar o ticket!", ephemeral: true, }); // 如果不需要继承归档分类的权限,可给setParent加第二个参数 { lockPermissions: false } await interaction.channel.setParent("915985254127370240"); // 读取当前频道对应的工单创建者ID let channelOwnerSnap = await db.ref(`Ticket/ChannelOwner/${interaction.channel.id}`).once("value"); let channelOwner = channelOwnerSnap.val(); if (channelOwner?.userId) { // 正确调用权限修改方法,注意加await异步等待执行完成 await interaction.channel.permissionOverwrites.edit(channelOwner.userId, { VIEW_CHANNEL: false }); } }
- 可删除原来全局位置定义的
subTicketSuporte相关代码,该逻辑已经不再使用。
内容的提问来源于stack exchange,提问作者snowe
相关产品推荐
相关产品推荐

