Discord.js机器人语音频道删除命令报错求助
解决Discord机器人频道删除功能的两个错误
让我们一步步拆解你遇到的问题,然后给出针对性的修复方案:
第一个错误:Cannot read property 'type' of undefined
这个错误的核心是你尝试访问了一个不存在的对象的属性。当message.guild.channels.cache.find(r=>r.name === ch)找不到匹配的频道时,fetchedChannel的值会是undefined,这时候直接访问fetchedChannel.type自然会抛出报错。
另外,你最初用message.content.split提取频道名的逻辑很容易出错——如果用户输入时多打了空格,或者频道名本身包含空格,这种拆分方式会导致你拿到的频道名不准确,进而根本找不到目标频道。
第二个错误:TypeError: args[1].join is not a function
args是一个字符串数组,比如用户输入!vchannel delete 我的语音频道,args会是['delete', '我的', '语音', '频道']。args[1]是数组里的单个元素('我的'),它是字符串类型,而join()是数组专属的方法,所以调用args[1].join()必然会报错。你需要的是把args中从第二个元素开始的所有内容拼接成完整的频道名。
修复后的完整代码片段
}else if (args[0] === "delete") { console.log('deleting'); // 提取从第二个参数开始的所有内容,拼接成支持空格的完整频道名 const channelName = args.slice(1).join(' '); // 先检查用户是否传入了频道名 if (!channelName) { return message.channel.send('请指定要删除的语音频道名称!').then(msg => msg.delete({ timeout: 5000 })); } // 查找目标频道 const fetchedChannel = message.guild.channels.cache.find(r => r.name === channelName); // 依次检查频道是否存在、是否为语音频道 if (!fetchedChannel) { return message.channel.send(`找不到名为 ${channelName} 的频道!`).then(msg => msg.delete({ timeout: 5000 })); } if (fetchedChannel.type !== "voice") { return message.channel.send(`${channelName} 不是语音频道!`).then(msg => msg.delete({ timeout: 5000 })); } // 删除频道并处理可能的异常 fetchedChannel.delete() .then(() => { message.channel.send(`Голосовой канал ${channelName} удален`).then(msg => msg.delete({ timeout: 5000 })); console.log('delete complete'); }) .catch(err => { console.error('删除频道时出错:', err); message.channel.send(`删除频道 ${channelName} 失败,请检查机器人权限!`).then(msg => msg.delete({ timeout: 5000 })); }); }
关键修复点说明
- 用
args.slice(1).join(' ')正确提取带空格的频道名:slice(1)获取args中从索引1开始的所有元素,再用join(' ')拼接成完整字符串,完美支持带空格的频道名。 - 增加了边界检查:先判断用户是否传入频道名,再判断是否找到频道,最后验证频道类型,彻底避免访问
undefined属性的问题。 - 增加了异常捕获:用
.catch()处理删除频道时可能出现的权限不足、频道不存在等异常,让机器人的容错性更强。
如果还有其他问题,或者需要完整代码的进一步调试,可以随时补充更多细节~
内容的提问来源于stack exchange,提问作者autrizz
相关产品推荐
相关产品推荐

