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
相关产品推荐
相关产品推荐

