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

Discord机器人跨频道转发消息时报send属性未定义错误如何解决

排查解决步骤
  • 变量名一致性校验
    你代码中消息事件监听绑定在bot实例上,但获取目标频道时调用的是client.channels,如果你的Discord客户端实例初始化时命名为bot,此处的client属于未定义变量,直接改为bot.channels即可。
  • 确认频道ID与权限
    校验填写的目标频道ID910109122572218378为正确的频道雪花ID,同时确认机器人已加入目标频道所在服务器,且拥有该频道的发送消息权限。
  • 检查客户端意图配置
    如果你使用的是discord.js v13及以上版本,初始化客户端时必须开启对应意图才能正常加载缓存、监听事件:
const { Client, Intents } = require('discord.js');
// v13 配置示例,v14 意图命名有调整可对应官方文档修改
const bot = new Client({ 
  intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES] 
});

其中GUILDS是获取频道缓存的必要意图,GUILD_MESSAGES是监听消息事件的必要意图。如果使用v14版本,原message事件已废弃,需要改为监听messageCreate事件。

  • 优化频道获取逻辑,增加异常处理
    不要直接调用未判断是否存在的频道实例方法,可优先拉取最新频道数据再做判断,避免缓存不存在导致报错:
bot.on('message', async (message) => {
  message
    .delete({ timeout: 10 })
    .catch((err) =>
      logger.error(`Could not delete message (Error: ${err.message})`),
    );

  if (message.channel.name != 'from-user') {
    logger.info(
      `message has not been sent in the forwarding channel! Aborting request.`,
    );
  } else {
    if (message.author.bot) return;
    try {
      // 优先取缓存,缓存不存在则从接口拉取频道信息
      const targetChannel = await bot.channels.fetch('910109122572218378');
      if (!targetChannel) {
        logger.error('未找到目标转发频道');
        return;
      }
      await targetChannel.send(message.content);
      console.log(message.content);
    } catch (err) {
      logger.error(`转发消息失败:${err.message}`);
    }
    return;
  }
});

内容的提问来源于stack exchange,提问作者Ecstasyyy.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:36:04