Discord.js v13升级出现commands.array is not a function错误如何解决
报错原因
discord.js v12及更早版本中,Collection 类提供了内置的array()方法可直接将集合转为数组,但v13版本依赖的@discordjs/collection v0.5+版本移除了该方法,因此触发第一个报错。
你尝试调用的values()方法返回的是迭代器对象,本身不支持直接调用forEach,因此触发第二个报错。
正确实现方案
方案1:直接遍历Collection(推荐,无需转数组)
message.client.commands本身就是Collection实例,自带forEach遍历方法,无需额外转数组:
message.client.commands.forEach((cmd) => { if(cmd.name == args[0].toLowerCase() || cmd.aliases?.includes(args[0].toLowerCase())) { embed.addField("**Description**", `${cmd.description ?? '暂无描述'}`, false) embed.addField("**Usage**", `${cmd.usage ?? '暂无用法说明'}`, true) embed.addField("**Aliases**", `${cmd.aliases?.join('、') ?? '无别名'}`, true) embed.addField("**Examples**", `${cmd.examples ?? '暂无示例'}`, true) message.channel.send({ embeds: [embed] }); } })
方案2:先转数组再遍历
如果你的场景确实需要先拿到命令数组,可通过以下两种方式实现转换:
- 扩展运算符写法
let commands = [...message.client.commands.values()];
- Array.from写法
let commands = Array.from(message.client.commands.values());
性能优化建议
无需遍历所有命令,直接用Collection自带的find方法匹配目标命令,执行效率更高:
const targetCmd = message.client.commands.find(cmd => cmd.name === args[0].toLowerCase() || cmd.aliases?.includes(args[0].toLowerCase()) ); if (targetCmd) { embed.addField("**Description**", `${targetCmd.description ?? '暂无描述'}`, false) embed.addField("**Usage**", `${targetCmd.usage ?? '暂无用法说明'}`, true) embed.addField("**Aliases**", `${targetCmd.aliases?.join('、') ?? '无别名'}`, true) embed.addField("**Examples**", `${targetCmd.examples ?? '暂无示例'}`, true) message.channel.send({ embeds: [embed] }); }
内容的提问来源于stack exchange,提问作者MegaMix_Craft
相关产品推荐
相关产品推荐

