Discord Bot跨服转发消息时报Cannot read property 'send' of undefined如何解决
错误触发原因
出现该报错的直接原因是调用send方法的channel对象为undefined,核心问题出在你的代码逻辑存在多处错误:
- 代码中没有定义
server变量,server.channels.cache.find一行无法拿到正确的频道集合,find方法大概率返回空值。 - 没有对
find的返回结果做非空校验,匹配不到对应名称的频道时就会直接调用send触发类型错误。 - 现有逻辑完全不符合需求:你遍历了bot加入的所有服务器,却试图从不存在的
server对象中拉取频道批量发消息,而非根据消息来源服务器匹配接收服的单个对应频道。
修复方案
你需要先固定几个配置项,再调整匹配逻辑,才能实现需求:
- 提前记录第四个接收服务器的ID,以及A、B、C三个来源服务器的ID,避免通过名称匹配出现重名问题。
- 收到消息后先判断消息来源是否为允许转发的服务器,非目标来源直接跳过。
- 到接收服务器中查找对应频道,匹配成功且非空再发送消息。
修复后代码示例
// 替换为你自己的服务器/频道ID,可根据实际需求调整匹配规则 // 第四个接收服务器的ID const RECEIVE_GUILD_ID = 'xxxxxxx'; // 来源服务器ID和接收服对应频道ID的映射表,稳定性高于名称匹配 const SOURCE_TO_TARGET_CHANNEL = { "A服务器ID": "接收服guild A频道ID", "B服务器ID": "接收服guild B频道ID", "C服务器ID": "接收服guild C频道ID" }; // 消息监听事件内的逻辑 const msgLog = `[#${message.channel.name}]=[${message.author.username}#${message.author.discriminator}]=> ${message.content}`; // 过滤非服务器消息、非允许的来源服务器消息 if (!message.guild || !SOURCE_TO_TARGET_CHANNEL[message.guild.id]) return; // 获取接收服务器实例 const receiveGuild = client.guilds.cache.get(RECEIVE_GUILD_ID); if (!receiveGuild) return console.error('未找到接收服务器,请检查ID配置'); // 获取对应目标频道 const targetChannel = receiveGuild.channels.cache.get(SOURCE_TO_TARGET_CHANNEL[message.guild.id]); if (!targetChannel || !targetChannel.isText()) return console.error('未找到匹配的目标文本频道'); // 发送消息,添加异常捕获避免进程崩溃 targetChannel.send(msgLog).catch(err => console.error('消息发送失败:', err));
如果你坚持要用名称匹配频道,也可以将查找频道的逻辑替换为:
const targetChannel = receiveGuild.channels.cache.find( channel => channel.name === `guild ${message.guild.name}` && channel.isText() );
注意事项
- 需要确保bot在接收服务器的对应频道拥有
发送消息权限,否则会出现发送失败的问题。 - 建议优先使用ID匹配服务器/频道,名称随时可能被修改,会导致匹配逻辑失效。
内容的提问来源于stack exchange,提问作者Daniel Nikolov
相关产品推荐
相关产品推荐

