Discord.js SlashCommandBuilder中如何验证字符串输入?
Discord.js 斜杠命令字符串输入验证方案
首先明确:SlashCommandBuilder本身不支持在命令发送前通过正则或自定义规则做内容验证,Discord官方提供的预验证只有长度限制、必填性、Choices这些基础功能,而Choices最多只能设置25个选项,显然没法适配你600个有效条目的场景。
你有两个可行的解决方案:
1. 命令提交后即时验证
这是最直接的处理方式,用户提交命令后,在命令执行的回调逻辑里做内容校验:
- 把600个有效条目存入
Set(查找效率O(1),比数组遍历快很多) - 获取用户输入后,直接判断是否在Set中
- 如果不匹配,立刻回复仅用户可见的无效提示(用
ephemeral: true避免打扰频道)
示例代码片段:
// 提前定义有效条目集合 const validEntriesSet = new Set([/* 你的600个有效条目 */]); async execute(interaction) { const userInput = interaction.options.getString('你的选项名'); if (!validEntriesSet.has(userInput)) { return interaction.reply({ content: '输入无效,请检查内容后重试', ephemeral: true }); } // 输入有效,执行后续逻辑 await interaction.reply(`处理内容:${userInput}`); }
2. 搭配自动补全(Autocomplete)优化体验
虽然不能用Choices,但可以开启自动补全功能,引导用户输入正确内容,同时保留命令的完整性:
- 在StringOption上调用
.setAutocomplete(true)开启自动补全 - 编写
autocomplete回调,根据用户实时输入过滤600个有效条目,返回前25个匹配结果(Discord限制自动补全最多返回25条) - 命令执行时仍保留兜底验证,防止用户手动输入不匹配内容
完整示例代码:
const { SlashCommandBuilder } = require('discord.js'); // 你的600个有效条目 const validEntries = [/* ... */]; const validEntriesSet = new Set(validEntries); module.exports = { data: new SlashCommandBuilder() .setName('your-command') .setDescription('你的命令描述') .addStringOption(option => option.setName('input') .setDescription('请输入内容') .setRequired(true) .setMinLength(1) .setMaxLength(20) .setAutocomplete(true) ), async autocomplete(interaction) { const focusedValue = interaction.options.getFocused().toLowerCase(); // 过滤匹配的条目,取前25个 const matchedEntries = validEntries.filter(entry => entry.toLowerCase().includes(focusedValue) ).slice(0, 25); await interaction.respond( matchedEntries.map(entry => ({ name: entry, value: entry })) ); }, async execute(interaction) { const userInput = interaction.options.getString('input'); if (!validEntriesSet.has(userInput)) { return interaction.reply({ content: '输入无效,请使用自动补全提示的内容', ephemeral: true }); } // 执行正常逻辑 await interaction.reply(`已处理有效输入:${userInput}`); } };
这种方式既不用拆分命令,又能大幅降低用户输入错误的概率,同时兜底验证也能保证逻辑严谨性。
内容的提问来源于stack exchange,提问作者Saelvarath
相关产品推荐
相关产品推荐

