Discord.js v14斜杠命令选项返回undefined问题求助
问题解决:Slash Command选项返回undefined的修复
问题根源
你直接从interaction.options解构获取选项值的方式完全错误。在Discord.js v14及以后版本中,interaction.options是CommandInteractionOptionResolver实例,并非存储选项键值的普通对象,直接解构自然会得到undefined。必须通过它提供的类型方法来获取对应选项值——比如字符串选项要用getString()。
修复后的完整代码
const { SlashCommandBuilder } = require('discord.js'); const fs = require('fs').promises; // 用Promise版fs配合async/await,避免回调嵌套 const path = require('path'); // 用path处理路径,兼容跨平台 module.exports = { data: new SlashCommandBuilder() .setName('addfrozencustomer') .setDescription('添加冻结客户的账户/Discord信息') .addStringOption(option => option.setName('id') .setDescription('客户ID') .setRequired(true)) .addStringOption(option => option.setName('username') .setDescription('客户用户名') .setRequired(true)) .addStringOption(option => option.setName('email') .setDescription('客户邮箱') .setRequired(true)), async execute(interaction) { // 正确获取选项值的方式 const id = interaction.options.getString('id'); const username = interaction.options.getString('username'); const email = interaction.options.getString('email'); const data = `${id}:::${username}:::${email}`; try { // 拼接正确的文件路径 const filePath = path.join(__dirname, 'users', 'frozencustomers.txt'); await fs.appendFile(filePath, `${data}\n`); console.log('数据已成功写入文件'); // Slash命令优先用reply回复,避免Discord判定命令超时失败 await interaction.reply(`已成功添加冻结客户:\n ID: ${id}\n 用户: ${username}\n 邮箱: ${email}`); } catch (error) { console.error('写入文件失败:', error); // 仅让命令发起者看到错误提示,避免频道刷屏 await interaction.reply({ content: '添加客户信息时发生错误,请联系管理员', ephemeral: true }); } } };
额外优化说明
- 替换
fs.appendFile为fs.promises.appendFile,配合async/await让异步逻辑更清晰,便于统一错误处理 - 用
path.join处理文件路径,避免Windows和Linux系统的路径分隔符差异问题 - 将
interaction.channel.send改为interaction.reply,符合Slash命令的官方规范,防止Discord提示命令执行超时失败 - 错误回复添加
ephemeral: true,仅命令发起者可见,减少频道干扰
内容的提问来源于stack exchange,提问作者BrotatoChip
相关产品推荐
相关产品推荐

