discord.js v12 如何校验多角色权限实现指定角色可触发命令
问题解决方法
原有代码错误点
- 逻辑运算符使用错误:当前
&&要求用户同时持有三个允许角色才通过校验,和你「任意持有一个即可」的需求相悖,需更换为||逻辑或运算符 - 无角色存在校验:如果服务器内不存在对应名称的角色,
find()方法会返回undefined,此时读取.id属性会触发代码报错 - 事件名适配问题:discord.js v13及以上版本已废弃
message事件,需替换为messageCreate事件
修正后可直接运行的代码
// discord.js v13+ 版本使用messageCreate事件,v12及以下可保留message事件 client.on('messageCreate', message => { if (message.content === 'test') { // 先判断是否是服务器消息,避免私信场景报错 if (!message.guild || !message.member) return message.channel.send('bad'); // 查找允许的三个角色 const ownerRole = message.guild.roles.cache.find(r => r.name === "owner"); const modRole = message.guild.roles.cache.find(r => r.name === "mod"); const adminRole = message.guild.roles.cache.find(r => r.name === "admin"); // 校验:用户持有任意一个允许角色即可通过 const hasPermission = (ownerRole && message.member.roles.cache.has(ownerRole.id)) || (modRole && message.member.roles.cache.has(modRole.id)) || (adminRole && message.member.roles.cache.has(adminRole.id)); if (hasPermission) { message.channel.send('hello'); } else { message.channel.send('bad'); } } });
更易扩展的优化写法
如果后续要新增允许的角色,直接修改allowedRoleNames数组即可,不需要重复写校验逻辑:
client.on('messageCreate', message => { if (message.content === 'test') { if (!message.guild || !message.member) return message.channel.send('bad'); // 允许的角色名称数组,新增权限直接加元素即可 const allowedRoleNames = ['owner', 'mod', 'admin']; // 判断用户的角色是否有任意一个在允许列表中 const hasPermission = message.member.roles.cache.some(role => allowedRoleNames.includes(role.name)); hasPermission ? message.channel.send('hello') : message.channel.send('bad'); } });
提示:如果你的服务器允许修改角色名称,建议使用角色ID代替名称做判断,避免角色改名后权限校验失效。获取角色ID需要开启Discord开发者模式,右键角色即可复制ID。
内容的提问来源于stack exchange,提问作者Latepate
相关产品推荐
相关产品推荐

