Discord.js编写仅管理员可执行命令时报permissions.has错误如何解决
报错原因
message.author是Discord全局用户对象,不包含单服务器内的权限属性,服务器成员的权限信息需要从message.member(发送者在当前服务器的成员实例)上获取,你调用了不存在的message.author.permissions属性,所以读取has方法时抛出undefined类型错误。- 权限判断逻辑写法错误:
!Permissions.STAGE_MODERATOR是对权限常量做逻辑非运算,会直接转为布尔值,不属于合法的权限入参,正确写法是将权限常量传入has()方法后,再对整个判断结果取非。
修复方案
以下是修正后的完整代码,同时优化了原有逻辑的不合理之处:
// Discord.js v14版本已将Permissions重命名为PermissionsBitField,v13及以下版本可替换为原Permissions const { PermissionsBitField } = require('discord.js'); //comando nick if(comando === 'nick'){ // 修正权限获取来源和判断逻辑,这里使用更贴合改昵称场景的ManageNicknames权限,你也可以替换回STAGE_MODERATOR if (!message.member.permissions.has(PermissionsBitField.Flags.ManageNicknames)) return message.reply('No Perms!'); if(args.length === 0){ message.channel.send(`请输入要设置的昵称`); } else { // 加入错误捕获逻辑,避免机器人权限不足时抛出未捕获异常 message.guild.members.cache.get(client.user.id).setNickname(args.join(' ')) .then(() => { message.channel.send(`已成功修改机器人昵称`); }) .catch(() => { message.channel.send(`修改昵称失败,请检查机器人权限是否足够`); }); } }
额外优化说明
- 原判断
args == ''的逻辑不够严谨,args通常为命令拆分后的数组,使用args.length === 0判断空输入更准确,调用args.join(' ')拼接参数可支持设置带空格的昵称。 - 新增设置失败捕获逻辑,可处理机器人角色等级不足、无修改昵称权限等异常场景。
内容的提问来源于stack exchange,提问作者GettyLowPepe
相关产品推荐
相关产品推荐

