Discord.js斜杠命令子命令函数调用报错:subcommand未定义
解决Discord机器人斜杠命令子命令复用函数报错问题
问题背景
开发Discord机器人斜杠命令的子命令功能时,因存在多个结构相似的子命令,尝试复用函数创建,但调用时触发ReferenceError,而将逻辑直接内联到.addSubcommand()中可正常运行。
错误根源
- 调用
.addSubcommand()时,直接执行了subCommandDB(subcommand,dbs.itemDB,'item'),但此处的subcommand变量从未定义; - 原函数中手动将
subcommand赋值为普通Object(),而Discord.js要求使用它自身提供的SubcommandBuilder实例,而非自定义对象; - 核心误区:
.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
相关产品推荐
相关产品推荐

