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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:35:24