Discord.js机器人角色判断报错:如何正确引入roles.json数组?
解决Discord.js中从JSON文件引入角色数组的问题
嘿,我来帮你搞定这个角色判断的问题!你之前用模板字符串引入数组的方式是错误的,这也是导致代码报错的核心原因,咱们一步步来修正:
错误原因分析
你写的[${roles.roles}]会把roles.roles这个数组转换成逗号分隔的字符串,比如原本的数组["role one", "role two"]会变成字符串"role one,role two",然后你把这个字符串放到数组里,就得到了["role one,role two"]——这时候你的判断逻辑变成了检查角色名是否等于这个长字符串,自然永远匹配不上,所以代码失效。
正确的实现方式
首先先修正文件导入的路径(你之前写的.config.roles.json是错误的路径格式,应该用./config/roles.json),然后直接使用导入的数组即可,完全不需要模板字符串:
1. 正确导入roles.json
// 注意路径是./config/roles.json,用斜杠分隔,不是点 const rolesConfig = require('./config/roles.json');
2. 修正角色判断逻辑
如果你的Discord.js版本是v13及以下,直接这样写:
if (message.member.roles.some(r => rolesConfig.roles.includes(r.name))) { console.log(`User has one of those roles`); } else { console.log(`no available roles attached`); }
如果是Discord.js v14及以上,因为message.member.roles现在是RoleManager对象,需要通过.cache访问缓存的角色集合,代码要调整成:
if (message.member.roles.cache.some(r => rolesConfig.roles.includes(r.name))) { console.log(`User has one of those roles`); } else { console.log(`no available roles attached`); }
额外提示(针对未来启用黑名单功能)
你roles.json里的UseListAsBlacklist字段如果之后要启用黑名单功能,逻辑可以这样写:
const hasTargetRole = message.member.roles.cache.some(r => rolesConfig.roles.includes(r.name)); if (rolesConfig.UseListAsBlacklist) { // 黑名单模式:用户没有列表中的角色时执行逻辑 if (!hasTargetRole) { console.log(`User doesn't have any blacklisted roles`); } } else { // 白名单模式:用户有列表中的角色时执行逻辑 if (hasTargetRole) { console.log(`User has one of those roles`); } }
内容的提问来源于stack exchange,提问作者JavaGamer
相关产品推荐
相关产品推荐

