Discord.js Slash Command注册代码报错,如何修复?
修正Discord.js斜线命令注册的「Invalid Form Body」错误
错误原因
你的代码错误地将SlashCommandBuilder实例用JSON.stringify()转成了字符串,而Discord API要求接收原生JavaScript对象而非字符串化的JSON,这直接触发了格式校验失败。
具体修正步骤
修改部署脚本的命令收集逻辑:
将循环里的这一行:commands.push(JSON.stringify(command.data));替换为:
commands.push(command.data.toJSON());(
SlashCommandBuilder自带的.toJSON()方法会生成完全符合Discord API规范的结构对象)验证命令文件格式
确保./commands目录下的每个命令文件都正确导出SlashCommandBuilder实例,示例格式如下:const { SlashCommandBuilder } = require('discord.js'); module.exports = { data: new SlashCommandBuilder() .setName('命令名') // 命令名不能含空格,长度1-32字符 .setDescription('命令的简短描述') // 不能为空,长度1-100字符 // 可添加其他命令选项 , async execute(interaction) { // 命令执行逻辑 }, };额外检查项
- 确认
config.json中的clientId、token与机器人后台信息完全一致 - 命令的
name和description必须严格符合Discord的规则(无空格、长度合规)
- 确认
修正后的完整部署脚本
const { REST, Routes } = require('discord.js'); const { clientId, token } = require('./config.json'); const fs = require('node:fs'); const commands = []; const commandFiles = fs.readdirSync('./commands').filter(file => file.endsWith('.js')); for (const file of commandFiles) { const command = require(`./commands/${file}`); commands.push(command.data.toJSON()); // 修正后的代码 } const rest = new REST({ version: '10' }).setToken(token); (async () => { try { console.log(`开始刷新 ${commands.length} 个应用(/)命令`); const data = await rest.put( Routes.applicationCommands(clientId), { body: commands }, ); console.log(`成功重载 ${data.length} 个应用(/)命令`); } catch (error) { console.error(error); } })();
内容的提问来源于stack exchange,提问作者Opilite Elix
相关产品推荐
相关产品推荐

