discord.js v12运行kick命令出现BITFIELD_INVALID错误如何解决?
问题原因
你遇到的RangeError [BITFIELD_INVALID]: Invalid bitfield flag or number报错,核心原因是你在权限判断中使用了discord.js v12不存在的权限标识MANAGE_MEMBERS,框架无法识别这个无效的权限位就抛出了对应错误。
修复方案
按照以下步骤修改代码即可解决问题:
- 替换无效权限位
删除权限判断中的!perm.has("MANAGE_MEMBERS")条件,或者替换为discord.js v12支持的等价权限(比如MANAGE_ROLES,即管理角色权限),修改后的代码如下:
if (!perm.has("KICK_MEMBERS")&&!perm.has("MANAGE_GUILD")&&!perm.has("MANAGE_ROLES")&&!perm.has("ADMINISTRATOR")) return message.mentionReply(`${process.env.EMOTE_NO || '<:tairitsuno:869919370208509962>'}`+" | 你没有踢人的权限!");
- 修复拼写错误
你代码中存在笔误mentinReply,修正为正确的mentionReply:
if (!args[0]) { return message.mentionReply( `${process.env.EMOTE_NO || '<:tairitsuno:869919370208509962>'}`+" | 请@你要踢的用户或者输入对方的用户ID" ); }
移除无效逻辑
if (target === !args[0])这段判断逻辑完全无效,直接删除即可,你已经在前面做了args[0]的非空校验,不需要重复判断。优化用户拉取逻辑
你当前的fetch写法在拉取用户失败后,无法终止整个方法的执行,会导致后续访问target.id时报错,替换为try catch写法:
let target; try { target = await message.guild.members.fetch(args[0].replace("<@!", "").replace("<@","").replace(">","")) } catch(err) { return message.mentionReply(`${process.env.EMOTE_NO || '<:tairitsuno:869919370208509962>'}`+" | 找不到该用户"); }
- 补充Bot权限优先级判断
你只校验了命令使用者的角色优先级,没有校验Bot自身的角色是否高于目标用户,会出现权限足够但踢人失败的问题,在用户角色判断后补充这段代码:
let BotRole = message.guild.member(message.guild.me).roles.highest.position; let Role = target.roles.highest.position; let UserRole = message.member.roles.highest.position; if (UserRole <= Role) return message.mentionReply(`${process.env.EMOTE_NO || '<:tairitsuno:869919370208509962>'}`+' | 你无法踢除该用户,他的角色优先级比你高或者和你相同!'); // 新增Bot角色判断 if (BotRole <= Role) return message.mentionReply(`${process.env.EMOTE_NO || '<:tairitsuno:869919370208509962>'}`+' | 我无法踢除该用户,他的角色优先级比我高或者和我相同!');
内容的提问来源于stack exchange,提问作者Thành Lê
相关产品推荐
相关产品推荐

