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

Discord.js斜杠命令子命令函数调用报错:subcommand未定义

解决Discord机器人斜杠命令子命令复用函数报错问题

问题背景

开发Discord机器人斜杠命令的子命令功能时,因存在多个结构相似的子命令,尝试复用函数创建,但调用时触发ReferenceError,而将逻辑直接内联到.addSubcommand()中可正常运行。

错误根源

  1. 调用.addSubcommand()时,直接执行了subCommandDB(subcommand,dbs.itemDB,'item'),但此处的subcommand变量从未定义;
  2. 原函数中手动将subcommand赋值为普通Object(),而Discord.js要求使用它自身提供的SubcommandBuilder实例,而非自定义对象;
  3. 核心误区:.addSubcommand()需要接收回调函数,Discord.js会自动把SubcommandBuilder实例传入该回调,而非直接传入子命令实例。

修正后的可复用代码

// 子命令工厂函数,返回适配Discord.js的回调
function createSubCommandDB(nameDB, name) {
  return (subcommand) => {
    subcommand.setName(name)
      .setDescription(`Add record to ${name} database`);

    // 遍历数据库属性生成选项
    for (const prop of nameDB.properties) {
      subcommand.addStringOption(option =>
        option.setName(prop)
          .setDescription('///')
          .setRequired(true)
      );
    }

    return subcommand;
  };
}

module.exports = {
  data: new SlashCommandBuilder()
    .setName('dbad')
    .setDescription('ADMIN ONLY. Add a record to the database of choice')
    // 传入工厂函数返回的回调,由Discord.js自动注入SubcommandBuilder实例
    .addSubcommand(createSubCommandDB(dbs.itemDB, 'item')),
  async execute(interaction) {
    // 业务逻辑...
  },
};

关键改动说明

  • 将原函数重构为工厂函数,它不直接处理子命令实例,而是返回符合Discord.js要求的回调函数;
  • 移除手动创建普通对象的错误逻辑,直接使用Discord.js传入的SubcommandBuilder实例;
  • 调用.addSubcommand()时,传入工厂函数返回的回调,而非直接执行函数;
  • 用for...of循环替代原始索引循环,代码更简洁易维护。

多子命令复用示例

如果需要添加多个同结构子命令,重复调用工厂函数即可:

module.exports = {
  data: new SlashCommandBuilder()
    .setName('dbad')
    .setDescription('ADMIN ONLY. Add a record to the database of choice')
    .addSubcommand(createSubCommandDB(dbs.itemDB, 'item'))
    .addSubcommand(createSubCommandDB(dbs.userDB, 'user'))
    .addSubcommand(createSubCommandDB(dbs.orderDB, 'order')),
  async execute(interaction) {
    // 业务逻辑...
  },
};

内容的提问来源于stack exchange,提问作者Holes RPG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:36:02