You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 13:15:00