Discord.js调用ApplicationCommandManager.set报commands.map is not a function错误求助
问题原因
你遇到的TypeError: commands.map is not a function报错核心原因是client.application.commands.set()的传参格式不符合discord.js的API要求:
discord.js的ApplicationCommandManager.set()方法第一个入参要求传入完整的斜杠命令数组,你当前在循环内逐次调用时第一个参数传入了字符串类型的command.data.name,方法内部会尝试对入参调用数组的map方法,字符串本身不存在该方法,因此触发报错。
修复方案
方案1:批量注册所有命令(推荐,注册效率更高)
先完成所有命令的收集,再统一调用set方法完成全局注册:
function setCommands(): void { var slashCommandFiles = fs.readdirSync('./commands').filter((file: string) => (file.endsWith('.js') && !forbiddenCommands.includes(file.slice(0, -3)))); // 第一步:收集所有命令到数组 for (const file of slashCommandFiles) { const command = require(`./commands/${file}`); slashCommands.push(command.data.toJSON()); } // 第二步:统一注册所有命令 if (client.application) { client.application.commands.set(slashCommands) .then(() => console.log("全局命令注册完成")) .catch(console.error); } else { console.error(client); throw new Error("Unable to load the commands"); } }
方案2:逐条添加命令
如果你确实需要单条独立注册命令,不要使用set方法,改用create方法即可:
// 循环内单条注册的正确写法 client.application.commands.create(command.data.toJSON()) .catch(console.error);
额外注意事项
- 全局命令注册最长需要1小时才能在所有服务器生效,测试阶段建议指定服务器ID注册测试命令,生效时间仅需数秒
- 若你使用的discord.js版本低于v14,仅需调整命令结构的适配写法,核心的API调用逻辑一致
内容的提问来源于stack exchange,提问作者RockRom
相关产品推荐
相关产品推荐

