如何为Discord.js机器人实现超25个车辆选项的自动补全
解决Discord.js Slash命令Choice选项数量限制的动态搜索方案
核心解决方案
Discord原生静态Choice选项上限是25个,要支持290+车辆的动态匹配,必须改用Autocomplete自动补全功能——它会在用户输入时实时触发后端逻辑,返回匹配的选项,完美绕过数量限制。
具体实现步骤
1. 重构命令定义:替换静态Choice为Autocomplete
先移除原代码里的静态addChoices配置,启用Autocomplete开关,并添加对应的处理逻辑。
原静态Choice写法(问题示例)
const { SlashCommandBuilder } = require('discord.js'); // 290+车辆数据 const allVehicles = [ { name: "Model 3", value: "model3" }, { name: "Model Y", value: "modely" }, // ... 其他车辆 ]; module.exports = { data: new SlashCommandBuilder() .setName('add-car') .setDescription('添加车辆信息到数据库') .addStringOption(option => option.setName('vehicle') .setDescription('选择车辆') .setRequired(true) .addChoices(...allVehicles.map(car => ({ name: car.name, value: car.value }))) ), async execute(interaction) { // 存入数据库逻辑 } };
修改后的Autocomplete实现
const { SlashCommandBuilder } = require('discord.js'); module.exports = { data: new SlashCommandBuilder() .setName('add-car') .setDescription('添加车辆信息到数据库') .addStringOption(option => option.setName('vehicle') .setDescription('输入车辆名称搜索') .setRequired(true) .setAutocomplete(true) // 关键:开启自动补全 ), // 自动补全处理逻辑 async autocomplete(interaction) { const userInput = interaction.options.getFocused().toLowerCase(); // 从数据库/全局数组获取全部车辆数据(替换成你的实际数据获取方式) const allVehicles = await yourDatabase.query('SELECT name, id FROM vehicles'); // 过滤匹配项,最多返回25个 const matchedVehicles = allVehicles .filter(car => car.name.toLowerCase().includes(userInput)) .slice(0, 25) .map(car => ({ name: car.name, value: car.id.toString() })); // 返回匹配结果给Discord await interaction.respond(matchedVehicles); }, // 原命令执行逻辑保留 async execute(interaction) { const selectedVehicleId = interaction.options.getString('vehicle'); // 后续存入车辆、颜色、车牌到数据库的逻辑 } };
2. 关键优化点
- 匹配规则调整:如果想要更精准的匹配,可以把
includes改成startsWith,只匹配以用户输入开头的车辆名称。 - 数据库查询优化:如果车辆数据存在数据库,直接在SQL里做模糊查询(比如
WHERE name LIKE ?),比把全量数据拉到内存过滤更高效。 - 响应时效:Discord要求Autocomplete必须在3秒内响应,确保数据查询/过滤逻辑足够快,避免超时。
排查问题的常见要点
如果修改后仍不生效,检查这几点:
- 命令是否重新部署同步到Discord了?修改命令定义后必须重新执行部署脚本。
- 你的Discord.js版本是否是v14及以上?Autocomplete功能仅在v14+支持。
- 过滤逻辑是否正确?比如是否不小心写死了返回25个固定选项,而非动态匹配结果。
内容的提问来源于stack exchange,提问作者iitxicz
相关产品推荐
相关产品推荐

