Discord机器人TypeError求助:无法读取'extracustomdesc'属性
问题分析与解决方案
报错原因
报错TypeError: Cannot read properties of undefined (reading 'extracustomdesc')的核心逻辑是:
- 执行
client.commands.filter((cmd) => cmd.category === "🎤 Voice").first()时,未找到任何属于🎤 Voice分类的命令,返回了undefined - 后续代码直接读取
undefined的extracustomdesc属性,触发了空值读取异常
排查步骤
- 校验命令分类配置:检查所有标注
🎤 Voice分类的命令,确认category字段的符号、空格完全匹配(比如是否误写为Voice而非🎤 Voice) - 检查命令加载逻辑:确认该分类下的命令文件是否被正确加载到
client.commands集合中,文件路径、导出格式是否符合机器人的加载规则
代码修复方案
两段代码都存在相同隐患:未对first()返回值做空值校验,且重复调用filter和first()浪费性能。建议修改如下:
第一段代码(Custom Queue(s) 部分)
// 缓存分类命令,避免重复执行过滤逻辑 const customQueueCmd = client.commands.filter((cmd) => cmd.category === "⚜️ Custom Queue(s)").first(); // 仅当找到有效命令时创建embed if (customQueueCmd) { var embed5 = new MessageEmbed() .setTitle(`[\`${customQueueCmd.extracustomdesc?.length || 0}\`] ⚜️ Custom Queue(s) Commands ⚜️ | ${settings.CUSTOMQUEUE ? "<a:yes:833101995723194437> ENABLED" : "<:no:833101993668771842> DISABLED"}`) .setDescription(`> *${customQueueCmd.extracustomdesc?.split(",").map(i => i?.trim()).join("︲") || "暂无分类描述"}*`) .addField("\u200b", "\u200b") .addField("<a:yes:833101995723194437> **Usage**", "> "+(customQueueCmd.usage || "暂无使用说明")); if(!filterdisabled || settings.CUSTOMQUEUE || settings.showdisabled) embeds.push(embed5); }
第二段代码(Voice 部分,报错位置)
// 缓存分类命令,避免重复执行过滤逻辑 const voiceCategoryCmd = client.commands.filter((cmd) => cmd.category === "🎤 Voice").first(); // 仅当找到有效命令时创建embed if (voiceCategoryCmd) { var embed13 = new MessageEmbed() .setTitle(`[\`${voiceCategoryCmd.extracustomdesc?.length || 0}\`] 🎤 Voice Commands 🎤 | ${settings.VOICE ? "<a:yes:833101995723194437> ENABLED" : "<:no:833101993668771842> DISABLED"}`) .setDescription(`> *${voiceCategoryCmd.extracustomdesc?.split(",").map(i => i?.trim()).join("︲") || "暂无分类描述"}*`) .addField("\u200b", "\u200b") .addField("<a:yes:833101995723194437> **Usage**", "> "+(voiceCategoryCmd.usage || "暂无使用说明")); if(!filterdisabled || settings.VOICE || settings.showdisabled) embeds.push(embed13); }
修复核心要点
- 用可选链操作符
?.避免属性不存在时触发报错 - 添加默认值(如
|| 0、|| "暂无描述")保证界面正常渲染 - 提前缓存过滤结果,减少重复运算
- 仅在找到有效命令时执行embed创建逻辑,避免无效操作
内容的提问来源于stack exchange,提问作者Morfar
相关产品推荐
相关产品推荐

