discord.js报读取undefined对象cache属性错误如何解决
问题说明
运行discord.js机器人命令时抛出错误Cannot read properties of undefined (reading 'cache'),该问题属于代码编写错误导致。
错误根因
代码中错误使用了message.author获取成员对象:
message.author返回的是全局User对象,仅包含用户基础信息,不存在roles属性- 访问不存在的
member.roles会得到undefined,再尝试读取undefined上的cache属性就会触发当前报错 - 只有和服务器绑定的GuildMember对象,才会挂载
roles属性存储用户在当前服务器的角色信息
修复步骤
- 替换成员获取逻辑:将
let member = message.author;修改为let member = message.member;,message.member才是消息发送者在当前服务器内的成员实例,可正常访问角色缓存 - 补全权限判断分支:原代码仅调用了
member.roles.cache.has('989342982224355409')但没有做逻辑拦截,如果是做权限校验,需要在判断不满足角色要求时直接返回,阻止后续代码执行 - 调整参数校验位置:将参数非空判断移到权限判断之后,避免无权限用户触发命令时先收到参数错误提示
修复后参考代码
const {MessageEmbed} = require('discord.js') module.exports = { name: 'cutem', execute(client, message, args) { // 获取当前服务器内的发送者成员实例 let member = message.member; // 角色权限校验 if(!member.roles.cache.has('989342982224355409')) { return message.reply("你没有使用该命令的权限"); } // 参数合法性校验 if(!args[0]) return message.reply("send what you want") let channel = message.mentions.channels.first() || message.channel; let embed = new MessageEmbed() .setImage(args[0]) .setColor("GREYPLE") channel.send(`@here by : <@${message.author.id}>` ) channel.send({embeds: [embed]}) } }
内容的提问来源于stack exchange,提问作者italuan
相关产品推荐
相关产品推荐

