Discord bot使用guildMember.roles.cache.has如何校验多个指定身份组
问题原因说明
你原代码的写法不生效是因为 JavaScript 中||(逻辑或运算符)的运行规则:它会从左到右求值,返回第一个为真值的表达式结果。你传入roleID1 || roleID2 || ... || roleID7时,只要第一个身份组IDroleID1是有效的非空字符串/数字,整个括号内的表达式最终就只会输出roleID1,相当于你只给has()方法传入了第一个身份组ID,剩下的ID根本没有被方法接收,自然不会做校验。
实现方案
分两种常见需求场景:
场景1:校验用户至少拥有其中一个身份组(或逻辑)
你可以用两种写法实现:
- 写法1:直接拆分多个
has()调用,用||连接
if (guildMember.roles.cache.has(roleID1) || guildMember.roles.cache.has(roleID2) || guildMember.roles.cache.has(roleID3) || guildMember.roles.cache.has(roleID4) || guildMember.roles.cache.has(roleID5) || guildMember.roles.cache.has(roleID6) || guildMember.roles.cache.has(roleID7)) { // 后续逻辑 }
- 写法2:把所有身份组ID存入数组,用
Array.some()方法简化代码(更推荐,ID数量多的时候更简洁)
const allowedRoles = [roleID1, roleID2, roleID3, roleID4, roleID5, roleID6, roleID7] if (allowedRoles.some(roleId => guildMember.roles.cache.has(roleId))) { // 后续逻辑 }
场景2:校验用户拥有所有列出的身份组(与逻辑)
如果你的需求是用户必须同时持有所有指定身份组才通过校验,用Array.every()方法实现:
const requiredRoles = [roleID1, roleID2, roleID3, roleID4, roleID5, roleID6, roleID7] if (requiredRoles.every(roleId => guildMember.roles.cache.has(roleId))) { // 后续逻辑 }
内容的提问来源于stack exchange,提问作者Romis Pejs
相关产品推荐
相关产品推荐

