Discord.js校验发送者角色权限的命令未执行 控制台无报错
代码故障原因排查
直接导致命令无响应的核心错误
- 角色权限判断的逻辑完全错位,整个if条件永假,导致块内代码永远不会执行
message.member.roles.cache.has('角色ID')这个方法的返回值是布尔值,仅用来标识当前发消息的成员是否持有对应ID的角色- 你写的判断逻辑是把这个布尔返回值和
sender(即message.author,是Discord用户实体对象)做严格相等比较,对象类型和布尔类型永远不可能相等,因此判断结果恒为false - 这种类型不匹配的严格相等比较是完全符合JS语法规范的,不会触发运行时异常,这也是控制台没有任何报错、命令静默无响应的核心原因。
附带的潜在运行风险
- 代码没有校验
revTarget是否存在:如果调用命令时没有@目标用户,message.mentions.users.first()会返回undefined,后续访问revTarget.id时会直接抛出空值错误 revAmount是字符串类型,直接参与数值比较、运算时存在隐式转换的边界隐患,最好显式转为数字类型再做判断和计算。
修正后的参考代码
const revAmount = commandArgs .split(/ +/g) .find((arg) => !/<@!?\d+>/g.test(arg)); const revTarget = message.mentions.users.first(); // 直接取两个角色校验的布尔结果做或判断,不需要和sender对象比较 if ( message.member.roles.cache.has('806432940094390273') || message.member.roles.cache.has('806433001843326996') ) { // 先校验必要的入参完整性 if (!revTarget) return message.channel.send('请指定要扣减货币的目标用户'); if (!revAmount || isNaN(Number(revAmount))) return message.channel.send( `Sorry ${message.author}, that's an invalid amount.`, ); const deductAmount = Number(revAmount); if (deductAmount <= 0) return message.channel.send( `Please enter an amount greater than zero, ${message.author}.`, ); currency.add(revTarget.id, -deductAmount); }
内容的提问来源于stack exchange,提问作者Jacobs Develop
相关产品推荐
相关产品推荐

