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

Discord机器人:如何在on message事件中给所有可访问频道发消息?

解决Discord机器人发送消息时“.send is not a function”错误

这个问题我之前也踩过坑!核心原因是你没过滤非文本类型的频道——服务器里的频道不止有能发消息的文本频道,还有分类频道、语音频道这些,它们根本没有send()方法,调用自然会报错。另外你代码里的client.channels.get(channel.id)完全是多余的,channel本身就是频道对象,不用再重复获取。

修复后的代码(适配旧版Discord.js)

// 遍历服务器内所有频道,只处理文本频道
msg.guild.channels.forEach(channel => {
  // 检查频道类型是否为文本频道(旧版Discord.js用'text'标识)
  if (channel.type === 'text') {
    // 发送消息,并添加错误捕获(避免无权限时程序崩溃)
    channel.send("you like bred? (message) ")
      .catch(error => {
        console.error(`无法给频道 ${channel.name} 发送消息:`, error);
      });
  }
});

关键优化点

  • 过滤频道类型:只对type === 'text'的频道调用send(),避免触发非文本频道的方法不存在错误。
  • 移除多余的client.channels.get():直接使用遍历得到的channel对象即可,无需二次获取。
  • 添加错误捕获:如果机器人在某个文本频道没有发送消息的权限,catch()会捕获错误并打印,不会导致整个机器人崩溃。

如果你用的是新版Discord.js(v13+)

新版的频道类型枚举变了,需要先导入ChannelType,同时频道集合的访问方式也有变化:

const { ChannelType } = require('discord.js');

msg.guild.channels.cache.forEach(channel => {
  if (channel.type === ChannelType.GuildText) {
    channel.send("you like bred? (message) ")
      .catch(error => console.error(`无法给频道 ${channel.name} 发送消息:`, error));
  }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 15:54:07