Discord.js v12 命令权限问题:配置Say命令仅管理员可用时出现空值报错
解决Discord Bot Say命令权限检查的
Cannot read property 'hasPermission' of null错误 你遇到的这个报错其实很典型,核心问题是**message.member的值为null**,所以没法调用hasPermission方法。这种情况通常发生在机器人收到私信(DM)消息的时候——因为私信里没有服务器(guild)成员的上下文,自然就没有message.member这个对象。
先看一下你的原代码:
client.on("message", (message) => { if (!message.member.hasPermission("ADMINISTRATOR")) return; if (message.content.startsWith(prefix + "say")) { if (message.author.bot) return; const SayMessage = message.content.slice(5).trim(); message.channel.send(SayMessage); if (message.deletable) message.delete(); return; } });
问题出在你先做了权限检查,但没先判断这条消息是不是来自服务器。只要机器人收到一条私信,message.member就会是null,直接调用hasPermission就会抛出TypeError。
修正后的代码
只需要在最开始先判断消息是否来自服务器,过滤掉私信即可:
client.on("message", (message) => { // 先过滤私信消息,因为私信里没有message.member if (!message.guild) return; // 再检查是否是机器人发送的消息 if (message.author.bot) return; // 检查是否是管理员 if (!message.member.hasPermission("ADMINISTRATOR")) return; // 处理Say命令逻辑 if (message.content.startsWith(prefix + "say")) { const SayMessage = message.content.slice((prefix + "say").length).trim(); // 这里建议用(prefix + "say").length代替固定的5,避免prefix变化时出问题 message.channel.send(SayMessage); if (message.deletable) message.delete(); return; } });
几个优化点说明:
- 先判断
!message.guild直接返回,彻底避免message.member为null的情况 - 把
message.author.bot的检查提前,减少不必要的后续判断 - 用
(prefix + "say").length代替硬编码的5,这样如果以后修改prefix,不需要手动调整截取长度
这样修改后,机器人就只会处理服务器内的消息,权限检查也能正常工作啦。
内容的提问来源于stack exchange,提问作者LowservvDsc
相关产品推荐
相关产品推荐

