Discord机器人guildMemberAdd事件触发时报Cannot read 'cache' of undefined错误
错误原因
你代码中的属性名拼写错误,discord.js v12及以上版本中,Guild实例上存储全服频道的集合属性是复数的channels,而不是你写的单数channel:
- 第6行
member.guild.roles.cache能正常运行,是因为roles本身就是Guild实例的合法属性,不存在拼写问题 - 第15、22行你写的
member.guild.channel.cache里,channel是不存在的属性,值为undefined,所以调用undefined.cache就触发了类型错误。
修复方案
- 把两处
member.guild.channel.cache修改为member.guild.channels.cache即可解决当前报错。 - 建议额外补充空值判断和网关意图校验,避免后续出现其他问题:
- 确认你的机器人在Discord开发者后台已经开启了
Server Members Intent(服务器成员意图),否则guildMemberAdd事件不会被正常触发 - 拿到频道实例后先判断是否存在,避免频道ID写错导致后续调用
send方法报错
- 确认你的机器人在Discord开发者后台已经开启了
- 修复后的核心代码示例:
// 提前获取频道实例,两处发送可以复用,不需要重复查询 const welcomeChannel = member.guild.channels.cache.get('768526997882142743'); // 用可选链操作符避免频道不存在时报错 welcomeChannel?.send({content: `${member}`, embeds: [WelcomeEmbed]}); welcomeChannel?.send({embeds: [LogEmbed]});
额外提示:如果你使用的是discord.js v14及以上版本,原有的MessageEmbed已经被废弃,需要替换为EmbedBuilder,导入方式修改为const { EmbedBuilder } = require('discord.js');即可,该改动不影响当前报错的修复。
内容的提问来源于stack exchange,提问作者NexusDevAndStuff
相关产品推荐
相关产品推荐

