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

部署Discord.js斜杠命令时遇ExpectedValidationError问题求助

Discord.js斜杠命令部署报错:ExpectedValidationError 解决方案

错误原因分析

从报错信息的核心字段可以定位问题:

ExpectedValidationError: Expected
validator: 's.instance(V)',
given: undefined,
expected: [Function: SlashCommandStringOption]

问题出在command0.js的addStringOption和addUserOption方法中——回调函数没有返回配置后的选项对象,导致构建器接收到undefined,不符合SlashCommandStringOption/SlashCommandUserOption的实例验证要求,触发了@sapphire/shapeshift的校验错误。

修复代码

修改command0.js中的选项构建逻辑,确保箭头函数返回配置完成的option对象:

import { SlashCommandBuilder } from "discord.js";

export default {
    'data': new SlashCommandBuilder()
        .setName('add')
        .setNameLocalizations({
            it:'aggiungi',
        })
        .setDescription('Description')
        .setDescriptionLocalizations({
            it:'Descrizione',
        })
        // 修复addStringOption:链式调用后自动返回option
        .addStringOption(option => 
            option.setName('name')
                .setNameLocalizations({
                    it:'nome',
                })
                .setDescription('Name')
                .setDescriptionLocalizations({
                    it:'Nome',
                })
                .setRequired(true)
        )
        // 修复addUserOption:同理返回配置后的option
        .addUserOption(option => 
            option.setName('user')
                .setNameLocalizations({
                    it:'utente',
                })
                .setDescription('User to add')
                .setDescriptionLocalizations({
                    it:'Utente da aggiungere',
                })
                .setRequired(true)
        ),
    'execute': async function(interaction) {
        // Execute stuff
    }
};

也可以通过显式返回的方式修复:

.addStringOption(option => {
    option.setName('name')
        .setNameLocalizations({ it:'nome' })
        .setDescription('Name')
        .setDescriptionLocalizations({ it:'Nome' })
        .setRequired(true);
    return option; // 显式返回配置后的选项对象
})

额外部署逻辑优化

原部署代码存在两个小问题,建议同步修复:

  1. forEach结合async/await无法等待所有部署请求完成,改用Promise.all确保所有命令部署完成后再执行后续逻辑
  2. 部署时应传递命令的JSON序列化数据,而非直接传递命令对象

修改后的部署代码:

(async () => {
    try {
        console.log('Deploying (/) commands');

        await Promise.all(client.commands.map(async cmd => {
            return rest.post(
                Routes.applicationCommands(process.env.APP_ID),
                {
                    headers: {
                        'content-type':'application/json',
                        'Authorization':`Bot ${process.env.DISCORD_TOKEN}`,
                    },
                    body: cmd.data.toJSON(), // 传递序列化后的命令数据
                },
            );
        }));

        console.log('Deployed (/) commands');
    } catch (error) {
        console.error(error);
    }
})();

内容的提问来源于stack exchange,提问作者CcmU

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 08:25:14