如何在Discord.js v13.12.0中获取SlashCommand的option参数值?
问题描述
我正在使用Discord.js v13.12.0开发Discord机器人,已创建名为info的SlashCommand,该命令包含必填的steam64字符串选项,代码如下:
const data = new SlashCommandBuilder() // </> command .setName('info') .setDescription('информация об админе') .addStringOption(option => option.setName('steam64') .setDescription('numbers') .setRequired(true)); //code client.on('interactionCreate', async interaction => { if (interaction.commandName === 'убитьбота') { interaction.reply("Успешно!"); client.destroy(); } else if (interaction.commandName === 'info'){ // Problem console.log("here"); id = interaction.options.string; // over here // console.log(id) // undefined console.log(admins[id]) // undefined const embed = new MessageEmbed() .setColor('#77dd77') .setTitle('Информация') .setDescription(`Имя: ${admins[id].NAME} \n **Описание:** ${admins[id].DIS} \n **Звание:** ${admins[id].ADMINLVL} \n **Наказание** - ***Выговоров:*** ${admins[id].PUNS.VARN} | ***Предов:*** ${admins[id].PUNS.PRED}`); // error await interaction.reply({ content: 'Вот!', ephemeral: true, embeds: [embed]}); console.log(interaction.option); interaction.reply(`debug - {admins} в conlose)`); } });
触发info命令时,尝试通过interaction.options.string获取传入的steam64参数值,结果返回undefined,无法读取对应的管理员JSON数据(如下),进而导致后续代码报错:
{ "76561198887558606": { "NAME": "Пельмень", "DIS": "Вы хотите знать что-то обо мне? Хи-Хи [NO DATA] ooops!", "ADMINLVL": "GOD XD", "PUNS": { "VARN": 0, "PRED": 0 } }, "76561199037779891":{ "NAME": "Senko Number ₲ne", "DIS": "[NO DATA] ooops!", "ADMINLVL": "Технарь", "PUNS": { "VARN": 0, "PRED": 0 } } }
解决方案
问题出在获取选项值的方式错误。Discord.js v13中,interaction.options没有直接的string属性,必须调用getString()方法并传入选项名称来获取对应值。
修正步骤:
- 替换错误的参数获取代码为标准方法
- 增加参数有效性校验,避免无效ID导致后续报错
- 修复重复调用
interaction.reply()的问题(同一交互只能调用一次reply(),后续消息需用followUp())
修正后的完整代码:
const data = new SlashCommandBuilder() .setName('info') .setDescription('информация об админе') .addStringOption(option => option.setName('steam64') .setDescription('numbers') .setRequired(true)); client.on('interactionCreate', async interaction => { if (interaction.commandName === 'убитьбота') { interaction.reply("Успешно!"); client.destroy(); } else if (interaction.commandName === 'info') { console.log("here"); // 正确获取steam64参数值 const id = interaction.options.getString('steam64'); console.log(id); // 校验管理员数据是否存在 if (!admins[id]) { return await interaction.reply({ content: 'Администратор с таким Steam ID не найден!', ephemeral: true }); } const embed = new MessageEmbed() .setColor('#77dd77') .setTitle('Информация') .setDescription(`Имя: ${admins[id].NAME} \n **Описание:** ${admins[id].DIS} \n **Звание:** ${admins[id].ADMINLVL} \n **Наказание** - ***Выговоров:*** ${admins[id].PUNS.VARN} | ***Предов:*** ${admins[id].PUNS.PRED}`); // 发送主回复,后续用followUp发送调试信息 await interaction.reply({ content: 'Вот!', ephemeral: true, embeds: [embed] }); console.log(interaction.options); await interaction.followUp({ content: 'debug - данные админов выведены в консоль', ephemeral: true }); } });
关键说明:
interaction.options.getString('选项名称')是Discord.js v13获取字符串类型选项的标准方法,同理还有getInteger()、getUser()等方法对应不同类型选项- 增加参数校验可避免
Cannot read properties of undefined类型的错误 - 同一交互只能调用一次
reply(),后续消息必须使用followUp()发送
内容的提问来源于stack exchange,提问作者ART0022VI
相关产品推荐
相关产品推荐

