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

Discord.js中如何在子命令后添加字符串输入?

Discord机器人Blacklist命令子命令添加输入选项的问题解决

错误原因分析

你的两次报错都违反了Discord应用命令的核心结构规则:

  • 第一次错误:主命令blacklist已经添加了子命令(add/remove/list),就不能再给主命令直接添加addStringOption这类普通选项。Discord要求一个命令只能是带子命令/子命令组的结构,或是带普通选项的结构,两者绝对不能混合。
  • 第二次错误:代码的括号嵌套逻辑错误,你把addStringOption写在了addSubcommand的回调函数外面,相当于还是给主命令加选项,而非对应子命令。正确的做法是把字符串选项嵌套在目标子命令的链式调用内部。

修正后的代码

const { SlashCommandBuilder } = require('discord.js');

module.exports = {
    data: new SlashCommandBuilder()
        .setName('blacklist')
        .setDescription('添加、移除或查看黑名单词库!')
        // 给add子命令绑定字符串输入选项
        .addSubcommand(subcommand =>
            subcommand
                .setName('add')
                .setDescription('添加词汇到黑名单')
                .addStringOption(option =>
                    option.setName('word')
                        .setDescription('要添加的词汇')
                        .setRequired(true) // 可选:设为必填,强制用户输入内容
                ))
        // 给remove子命令绑定字符串输入选项
        .addSubcommand(subcommand =>
            subcommand
                .setName('remove')
                .setDescription('从黑名单移除词汇')
                .addStringOption(option =>
                    option.setName('word')
                        .setDescription('要移除的词汇')
                        .setRequired(true)
                ))
        // list子命令无需额外选项
        .addSubcommand(subcommand =>
            subcommand
                .setName('list')
                .setDescription('查看黑名单列表')),
    async execute(interaction) {
        const subcommand = interaction.options.getSubcommand();
        if (subcommand === 'add') {
            const targetWord = interaction.options.getString('word');
            await interaction.reply(`已添加黑名单词汇:${targetWord}`);
            // 此处可添加写入数据库/本地文件的业务逻辑
        } else if (subcommand === 'remove') {
            const targetWord = interaction.options.getString('word');
            await interaction.reply(`已移除黑名单词汇:${targetWord}`);
            // 此处可添加删除数据库/本地文件中对应词汇的业务逻辑
        } else if (subcommand === 'list') {
            // 此处可读取黑名单列表并返回给用户
            await interaction.reply('当前黑名单列表:XXX');
        }
    },
};

为什么子命令不能与其他选项共存?

这是Discord应用命令的结构设计规则:当主命令包含子命令时,用户执行命令必须选择其中一个子命令才能触发逻辑,主命令本身不再直接处理任何输入。此时主命令的全局选项没有存在的意义——用户的操作焦点完全在子命令上,因此Discord API直接禁止了这种混合结构,避免逻辑冲突和交互混乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 21:35:15