discord.js v11/v13校验权限时报Cannot read properties of null错误如何解决
报错根因
- 你的报错核心是
msg.member为null导致的:当用户在私信(DM)频道给机器人发送命令时,Discord不会返回服务器成员对象,msg.member、msg.guild都会为空值,调用空值的方法就会抛出该异常。 clear命令本身属于服务器专属功能,私信场景下本来就无法执行批量删除消息的操作,只需要提前过滤非服务器的消息即可解决问题。
修复方案
直接在你的原有代码里新增非服务器消息的过滤逻辑即可,修改后的核心代码片段如下:
client.on("message", msg =>{ const {channel,author,guild,member} = msg; const args = msg.content.slice(prefix.length).trim().split(/ +/g); const cmd = args.shift().toLowerCase(); if(author.bot) return; // 新增:过滤私信频道的消息,非服务器消息直接跳过处理 if(!guild) return; if(cmd=="clear") { // 原有逻辑不变,这里的guild、member现在都保证有值,不会再报空指针 if(!guild.me.permissionsIn(channel).has(["SEND_MESSAGES"])) { return; } // 剩下的原有代码不需要改动
额外注意事项
- 如果你使用discord.js v13版本,除了上面的修改,还要注意权限枚举值为全大写带下划线格式,同时v13的消息事件名已经从
message改为messageCreate,还要确保你开启了GUILDS、GUILD_MESSAGES等必要的网关意图。 - 你现有代码里的参数校验顺序存在问题:当前是先转数字再判断是否有参数,建议把判断
args.length<1的逻辑放到parseInt之前,避免用户没传参数时parseInt(undefined)得到NaN的问题。
内容的提问来源于stack exchange,提问作者Werok Games
相关产品推荐
相关产品推荐

