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

discord.js工单系统调用permissionOverwrites报非函数错误如何解决

错误原因

你遇到的报错是因为discord.js v13及以上版本中,频道对象的permissionOverwrites是权限覆写管理器实例,不是可直接调用的函数,你调用了不存在的方法导致执行失败。同时你的代码还存在数据读取逻辑错误:你在全局位置读取的subTicketSuporte取的是当前触发交互的用户ID,点击归档按钮的是管理员时,你读取到的不是工单创建者的ID,就算方法改对也会删错权限。

修复步骤

  1. 先调整工单创建逻辑,存储频道对应创建者ID
    在你创建工单频道canalSuporte的代码块后,新增存储频道与创建者绑定关系的逻辑:
// 原有创建频道的代码不变
let canalSuporte = await interaction.guild.channels.create(/* 原有参数 */);
// 新增:绑定频道ID和创建者ID到数据库
await db.ref(`Ticket/ChannelOwner/${canalSuporte.id}`).set({
  userId: interaction.user.id
});
  1. 替换归档逻辑中的错误权限修改代码
    将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
    });
  }
}
  1. 可删除原来全局位置定义的subTicketSuporte相关代码,该逻辑已经不再使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:15:05