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

使用discord.js v14编辑频道权限时触发BitFieldInvalid错误

频道锁定命令触发BitFieldInvalid错误解决办法

问题背景

使用Discord.js开发频道锁定斜杠命令时,已成功获取频道和锁定原因参数,但调用channel.permissionOverwrites.edit方法时触发BitFieldInvalid错误。

原命令代码

const { SlashCommandBuilder } = require("discord.js");

module.exports = {
  data: new SlashCommandBuilder()
    .setName("lock")
    .setDescription("Locks the channel u specify.")
    .addChannelOption((option) =>
      option
        .setName("channel")
        .setDescription("The channel u want to lock.")
        .setRequired(true)
    )
    .addStringOption((option) =>
      option
        .setName("reason")
        .setDescription("The reason why the channel was locked.")
        .setRequired(true)
    ),
  async execute(interaction, client) {
    const channel = interaction.options.getChannel("channel");
    let reason = interaction.options.getString("reason");

        channel.permissionOverwrites.edit(interaction.guild.roles.everyone.id, {
            VIEW_CHANNEL: true,
            SEND_MESSAGES: false,
            READ_MESSAGE_HISTORY: true,
            ATTACH_FILES: false
        });
      await interaction.reply({
        content: `Locked channel ${channel} for the reason ${reason}`
      });
  },
};

报错信息

C:\Users\Robin\Documents\Bobbie\node_modules\discord.js\src\util\BitField.js:168
    throw new RangeError(ErrorCodes.BitFieldInvalid, bit);
          ^
    at PermissionOverwriteManager.upsert (C:\Users\Robin\Documents\Bobbie\node_modules\discord.js\src\managers\PermissionOverwriteManager.js:100:50)
    at PermissionOverwriteManager.edit (C:\Users\Robin\Documents\Bobbie\node_modules\discord.js\src\managers\PermissionOverwriteManager.js:145:17)
    at Object.execute (C:\Users\Robin\Documents\Bobbie\src\commands\moderation\lock.js:23:38)
    at Object.execute (C:\Users\Robin\Documents\Bobbie\src\events\client\interactionCreate.js:11:31)
    at Client.<anonymous> (C:\Users\Robin\Documents\Bobbie\src\functions\handlers\handleEvents.js:21:23)
    at Client.emit (node:events:527:28)
    at InteractionCreateAction.handle (C:\Users\Robin\Documents\Bobbie\node_modules\discord.js\src\client\actions\InteractionCreate.js:81:12) {
  code: 'BitFieldInvalid'
}
[nodemon] app crashed - waiting for file changes before starting...

解决方案

错误根源是Discord.js v14版本已废弃旧的权限字符串名称,需使用PermissionsBitField.Flags枚举值替代。修改后的代码如下:

const { SlashCommandBuilder, PermissionsBitField } = require("discord.js");

module.exports = {
  data: new SlashCommandBuilder()
    .setName("lock")
    .setDescription("锁定指定频道")
    .addChannelOption((option) =>
      option
        .setName("channel")
        .setDescription("要锁定的频道")
        .setRequired(true)
    )
    .addStringOption((option) =>
      option
        .setName("reason")
        .setDescription("锁定频道的原因")
        .setRequired(true)
    ),
  async execute(interaction, client) {
    const channel = interaction.options.getChannel("channel");
    const reason = interaction.options.getString("reason");

    // 使用PermissionsBitField.Flags枚举设置权限
    await channel.permissionOverwrites.edit(interaction.guild.roles.everyone.id, {
      [PermissionsBitField.Flags.ViewChannel]: true,
      [PermissionsBitField.Flags.SendMessages]: false,
      [PermissionsBitField.Flags.ReadMessageHistory]: true,
      [PermissionsBitField.Flags.AttachFiles]: false
    }, { reason }); // 将原因传入操作,同步到服务器审计日志

    await interaction.reply({
      content: `已锁定频道 ${channel},原因:${reason}`
    });
  },
};

核心修改点

  1. 导入PermissionsBitField:新增对PermissionsBitField模块的导入,用于获取官方定义的权限枚举
  2. 替换权限键名:将原有的VIEW_CHANNEL等字符串替换为PermissionsBitField.Flags对应的枚举值,并用方括号包裹作为对象属性键
  3. 添加await修饰:给channel.permissionOverwrites.edit加上await,确保权限修改完成后再回复交互
  4. 传入操作原因:将锁定原因作为第三个参数传入编辑方法,让操作记录显示在服务器审计日志中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:00:51