discord.js机器人无法获取频道 报错channels属性未定义如何解决?
问题原因
- 参数传递不匹配
index.js中触发joinserver的execute方法时仅传入了guild单个参数,但joinserver.js中execute函数的形参顺序为(message, args, client, guild),传入的guild被赋值给了第一个形参message,函数内实际用到的guild形参没有接收到任何值,为undefined,调用undefined.channels就会抛出对应错误。 - 变量引用错误
频道查找的回调函数中,还未完成channel变量的赋值就直接调用channel.permissionsFor,会触发额外的引用错误,应该使用回调接收的当前频道变量c做权限判断。 - (高版本discord.js适配问题)频道类型枚举值变更:discord.js v13及以上版本中,文本频道的
type值不再是text,匹配规则失效会无法找到目标频道。
解决方案
核心调整逻辑
- 修正参数匹配规则,让
execute函数可以正确接收到guild参数 - 修复查找回调内的变量引用错误
- 根据你的discord.js版本调整频道类型判断规则
- 增加兜底校验,避免查找不到频道时抛出新错误
修改后代码示例
index.js无需调整,仅修改joinserver.js即可:
const Discord = require("discord.js") // 如果使用discord.js v14+ 需额外导入频道类型枚举,删除下行注释即可 // const { ChannelType } = require('discord.js') module.exports = { name: 'joinserver', description: '', // 调整形参,直接接收传入的guild execute(guild) { // 修正变量引用与频道类型判断 // 不同版本的频道类型判断规则,根据你的版本选择对应写法: // v12及之前版本:c.type === 'text' // v13版本:c.type === 'GUILD_TEXT' // v14版本:c.type === ChannelType.GuildText const channel = guild.channels.cache.find(c => c.type === 'GUILD_TEXT' && c.permissionsFor(guild.me).has('SEND_MESSAGES')) const embeds = new Discord.MessageEmbed() .setTitle('机器人已加入服务器') // 可自行补充embed的其他配置项 // 增加兜底判断,仅在找到符合条件的频道时发送消息 // v13及以上版本发送embed必须放在embeds数组中,v12及之前可直接写channel.send(embeds) if(channel) channel.send({ embeds: [embeds] }) } }
内容的提问来源于stack exchange,提问作者Nevyllo Kalangi
相关产品推荐
相关产品推荐

