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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 11:27:47