RangeError [BITFIELD_INVALID]:无效的位域标志或数字

Posted

技术标签:

【中文标题】RangeError [BITFIELD_INVALID]:无效的位域标志或数字【英文标题】:RangeError [BITFIELD_INVALID]: Invalid bitfield flag or number 【发布时间】:2020-12-10 20:07:16 【问题描述】:

您好,我正在处理我的静音命令,但遇到了这个错误:

RangeError [BITFIELD_INVALID]: Invalid bitfield flag or number.
at Function.resolve (/app/node_modules/discord.js/src/util/BitField.js:150:19)
     at /app/node_modules/discord.js/src/util/BitField.js:148:54
   at Array.map (<anonymous>)
     at Function.resolve (/app/node_modules/discord.js/src/util/BitField.js:148:40)
     at RoleManager.create (/app/node_modules/discord.js/src/managers/RoleManager.js:112:58)
    at Client.<anonymous> (/app/index.js:586:41)
    at Client.emit (events.js:327:22)
    at MessageCreateAction.handle (/app/node_modules/discord.js/src/client/actions/MessageCreate.js:31:14)
   at Object.module.exports [as MESSAGE_CREATE] (/app/node_modules/discord.js/src/client/websocket/handlers/MESSAGE_CREATE.js:4:32)
    at WebSocketManager.handlePacket (/app/node_modules/discord.js/src/client/websocket/WebSocketManager.js:384:31)

我想为我的静音命令设置一个静音角色 这是我的命令:

 message.guild.roles.create(
                        data: 
                          name: 'muted',
                          color: '#ff0000',
                          permissions: [
                              "SEND_MESSAGES" === false,
                              "ADD_REACTIONS" === false

                          ]
                        ,
                        reason: 'to mute people',
                      )
                        .catch(console.error);
                 catch (e) 
                    console.log(e.stack);
                
             return message.channel.send('Cant')

我不知道怎么解决,请帮帮我

【问题讨论】:

【参考方案1】:

permissions 值不能使用数组(它必须是对象):

message.guild.roles.create(
                        data: 
                          name: 'muted',
                          color: '#ff0000',
                          permissions: 
                              SEND_MESSAGES: false,
                              ADD_REACTIONS: false
                          
                        ,
                        reason: 'to mute people',
                      )
                        .catch(console.error);
                 catch (e) 
                    console.log(e.stack);
                
             return message.channel.send('Cant')

【讨论】:

它仍然显示 RangeError [BITFIELD_INVALID]: Invalid bitfield flag or number 是的,我有同样的错误,即使它是一个对象,那么问题是什么?【参考方案2】:

我今天偶然发现了这个老问题,虽然我有点晚了,但 Androz2091 发布的当前主要答案是不正确的。

您不能使用数组作为权限值(它必须是一个对象):

这完全是错误的。在从 v11 到 v13 的任何版本的 discord.js 中,都没有权限值来创建一个角色,即该答案呈现的形式的对象文字。权限值必须是PermissionResolvablePermissionResolvable 可以是诸如"SEND_MESSAGES" 之类的字符串,也可以是此类字符串的数组。查看docs。

至于 OP 究竟出了什么问题,请注意他们是如何指定权限字符串的:

permissions: [
    "SEND_MESSAGES" === false,
    "ADD_REACTIONS" === false
]

这是不正确的。这与permissions: [ false, false ] 相同。显然false 不是权限,这就是为什么您会收到无效位字段标志错误。

创建角色时权限的工作方式并非如此。如果您查看公会的角色权限,您会发现每个权限都有两种状态:启​​用或禁用。权限值在guild.roles.create() 中的工作方式是,它启用任何指定的权限并禁用所有其他权限。这意味着,如果您希望为您的 Muted 角色禁用 SEND_MESSAGESADD_REACTIONS,您只需不将它们包含在权限数组中。

相反,包括被静音的用户应该拥有的任何权限。例如,如果他们应该能够观看频道,请给他们VIEW_CHANNEL。这是一个示例解决方案:

permissions: [
    "VIEW_CHANNEL",
    "READ_MESSAGE_HISTORY"
]

这对于静音角色应该很有效。请注意,discord.js v12 和 v13 的权限以这种方式工作的方式仍然相同,但是您创建角色本身的方式在版本之间发生了一些变化。但是,这个解决方案应该仍然适用于这两个版本。

【讨论】:

以上是关于RangeError [BITFIELD_INVALID]:无效的位域标志或数字的主要内容,如果未能解决你的问题,请参考以下文章

Nowjs:[RangeError:超出最大调用堆栈大小]

Datepicker - RangeError:无效的时间值

RangeError,语法错误:无效的正则表达式

RangeError:超出最大调用堆栈大小

猫鼬:UnhandledPromiseRejectionWarning:RangeError:超出最大调用堆栈大小

RangeError:无效的数组缓冲区长度 - Meteor JS