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
相关产品推荐
相关产品推荐

