You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord Bot跨服转发消息时报Cannot read property 'send' of undefined如何解决

错误触发原因

出现该报错的直接原因是调用send方法的channel对象为undefined,核心问题出在你的代码逻辑存在多处错误:

  • 代码中没有定义server变量,server.channels.cache.find一行无法拿到正确的频道集合,find方法大概率返回空值。
  • 没有对find的返回结果做非空校验,匹配不到对应名称的频道时就会直接调用send触发类型错误。
  • 现有逻辑完全不符合需求:你遍历了bot加入的所有服务器,却试图从不存在的server对象中拉取频道批量发消息,而非根据消息来源服务器匹配接收服的单个对应频道。
修复方案

你需要先固定几个配置项,再调整匹配逻辑,才能实现需求:

  1. 提前记录第四个接收服务器的ID,以及A、B、C三个来源服务器的ID,避免通过名称匹配出现重名问题。
  2. 收到消息后先判断消息来源是否为允许转发的服务器,非目标来源直接跳过。
  3. 到接收服务器中查找对应频道,匹配成功且非空再发送消息。

修复后代码示例

// 替换为你自己的服务器/频道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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 00:45:03