使用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}` }); }, };
核心修改点
- 导入PermissionsBitField:新增对
PermissionsBitField模块的导入,用于获取官方定义的权限枚举 - 替换权限键名:将原有的
VIEW_CHANNEL等字符串替换为PermissionsBitField.Flags对应的枚举值,并用方括号包裹作为对象属性键 - 添加await修饰:给
channel.permissionOverwrites.edit加上await,确保权限修改完成后再回复交互 - 传入操作原因:将锁定原因作为第三个参数传入编辑方法,让操作记录显示在服务器审计日志中
内容的提问来源于stack exchange,提问作者Bob Dylan
相关产品推荐
相关产品推荐

