Discord.js欢迎功能报Cannot read property 'guild' of undefined错误
报错问题描述
开发Discord机器人新成员自动欢迎功能时,持续触发TypeError: Cannot read property 'guild' of undefined报错,无法实现新成员入群自动发送欢迎消息的预期效果,原始功能代码如下:
const db = require('quick.db') const Discord = require('discord.js') module.exports = (client) => { client.on('guildMemberAdd', (member, message) => { let welcomechannel = db.get(`welcome_${message.guild.id}`) let welcomemsg = db.get(`Welcomemsg_${message.guild.id}`) if(welcomechannel = null || undefined) return if(welcomemsg = null || undefined) welcomemsg = `Hey <@${member.id}>! Make sure to read the rules and have a great time!` let embed = new Discord.MessageEmbed() .setColor('GOLD') .setDescription(welcomemsg) welcomechannel.send(embed) }) }
核心报错原因
- 事件入参认知错误:
guildMemberAdd事件的回调函数仅接收1个入参,即代表入群成员的GuildMember实例,代码中额外声明的message参数完全不存在,取值时message本身为undefined,自然无法读取其上的guild属性,直接触发类型报错。 - 空值判断逻辑完全错误:所有对数据库取值的空值判断都使用了单等号赋值运算符,比如
if(welcomechannel = null || undefined)本质是将welcomechannel变量强制赋值为null,既没有做相等性判断,还会覆盖原本从数据库取出的配置值,逻辑完全失效。 - 数据类型不匹配:数据库中存储的是欢迎频道的ID字符串,并非Discord.js的Channel类频道实例,直接对字符串类型的ID调用
.send()方法会触发方法不存在的类型错误。
修复后的可运行代码
const db = require('quick.db') const Discord = require('discord.js') module.exports = (client) => { client.on('guildMemberAdd', (member) => { // 从入群成员实例上获取所属服务器ID,替代不存在的message参数 const guildId = member.guild.id const welcomeChannelId = db.get(`welcome_${guildId}`) const welcomeMsgContent = db.get(`Welcomemsg_${guildId}`) // 无配置欢迎频道时直接终止逻辑 if (!welcomeChannelId) return // 未配置自定义欢迎语时使用默认文案 const finalWelcomeMsg = welcomeMsgContent || `Hey <@${member.id}>! Make sure to read the rules and have a great time!` // 通过缓存获取对应ID的频道实例 const welcomeChannel = member.guild.channels.cache.get(welcomeChannelId) // 兜底判断:频道不存在、机器人无发消息权限时直接终止 if (!welcomeChannel || !welcomeChannel.permissionsFor(member.guild.me).has('SEND_MESSAGES')) return const embed = new Discord.MessageEmbed() .setColor('GOLD') .setDescription(finalWelcomeMsg) welcomeChannel.send(embed) }) }
调试注意事项
- 确认机器人已开启服务器成员意图(Server Members Intent)权限,否则
guildMemberAdd事件根本不会被触发。 - 若使用Discord.js v14版本,可将
GOLD内置颜色名替换为对应十六进制色值0xffd700,避免触发版本弃用警告。 - 提前确认机器人在目标欢迎频道内拥有发送消息、嵌入链接的基础权限,否则即使代码逻辑正确也无法成功推送消息。
内容的提问来源于stack exchange,提问作者Nelly-o
相关产品推荐
相关产品推荐

