Discord.js机器人运行报Cannot read property 'send' of undefined错误如何修复
错误原因
报错TypeError: Cannot read property 'send' of undefined的触发位置是ready事件里的client.channels.cache.get(botlog).send(...)行,核心原因是client.channels.cache.get(botlog)返回了undefined,具体导致该问题的常见场景如下:
- 配置文件
config.yml中填写的botlog值错误,要么是频道ID写错、带多余空格,要么不是字符串格式的数字ID - 机器人未加入
botlog频道所在的服务器,或者没有该频道的查看频道、发送消息权限,频道不会被加载到客户端缓存中 - 若使用Discord.js v13及以上版本,初始化客户端时未开启
GUILDS意图,会导致频道缓存无法正常加载
修复方案
1. 校验基础配置
首先确认config.yml中botlog填写的是正确的频道数字ID,你可以在ready事件开头加打印代码确认参数和缓存是否正常:
client.on('ready', () => { // 新增校验打印 console.log('配置的日志频道ID:', botlog) console.log('已缓存的频道列表:', client.channels.cache.map(c => `ID:${c.id} 名称:${c.name}`)) // 原有代码... })
2. 加空值兼容判断
给所有调用日志频道发送消息的位置加空值校验,避免直接报错崩溃,修改后代码如下:
ready事件修改
const logChannel = client.channels.cache.get(botlog) if (logChannel) { logChannel.send(`** Bot Is Running**\n Servers: ${client.guilds.cache.size} And ${client.users.cache.size} Users`) } else { console.warn(`未找到ID为${botlog}的日志频道,跳过发送启动通知`) }
服务器进出事件同步修改
注意原代码中服务器移除的事件名拼写错误,正确事件名是guildDelete而非guildRemove:
client.on("guildCreate", guild => { const logChannel = client.channels.cache.get(botlog) logChannel?.send(`** NEW GUILD **\n Server: ${guild.name}\n Server ID: ${guild.id}`) }); client.on("guildDelete", guild => { const logChannel = client.channels.cache.get(botlog) logChannel?.send(`** GUILD REMOVED **\n Server: ${guild.name}\n Server ID: ${guild.id}`) });
3. 修复其他关联问题
- 你代码中前面从yaml配置中读取了
token变量,但登录时用的是process.env.token,如果你没有在运行环境配置对应环境变量,需要将登录代码改为client.login(token)使用配置文件中的token - 若使用Discord.js v13及以上版本,初始化客户端时需要开启对应权限意图:
const client = new Discord.Client({ intents: [ Discord.Intents.FLAGS.GUILDS, Discord.Intents.FLAGS.GUILD_MESSAGES ] });
内容的提问来源于stack exchange,提问作者noob
相关产品推荐
相关产品推荐

