如何处理Discord.js斜杠命令参数选项 解决子命令类型报错问题
错误原因
你的现有代码存在三个核心逻辑问题导致报错:
- 未判断子命令/子命令组的
options字段是否存在:未传参数的子命令不会返回options字段,直接访问arg.options.length会抛出空引用错误 - 边界判断逻辑错误:
arg.options.length < 1代表options是空数组,此时访问arg.options[0]必然越界报错 - 未初始化就赋值:else分支直接访问
args[arg.name].value,但args[arg.name]还未定义,会抛出不存在的属性错误
修复方案
需要先判断options存在性,同时增加子命令组的递归处理,修复后代码如下:
interaction.options.data.reduce((args, arg) => { // 处理子命令组 if (arg.type === "SUB_COMMAND_GROUP") { // 递归处理子命令组下的子命令 args[arg.name] = arg.options?.reduce((subArgs, subArg) => { if (subArg.type === "SUB_COMMAND") { // 子命令无参数的情况默认设为null if (!subArg.options) { subArgs[subArg.name] = null return subArgs } // 子命令有参数的情况:单个参数直接返回值,多个返回值数组 subArgs[subArg.name] = subArg.options.length === 1 ? subArg.options[0].value : subArg.options.map(opt => opt.value) } return subArgs }, {}) // 处理子命令 } else if (arg.type === "SUB_COMMAND") { if (!arg.options) { args[arg.name] = null return args } args[arg.name] = arg.options.length === 1 ? arg.options[0].value : arg.options.map(opt => opt.value) // 处理普通参数 } else { args[arg.name] = arg.value ?? null } return args }, {})
处理逻辑说明
- 子命令无参数时,返回值为
null - 子命令只有1个参数时,直接返回参数值,不需要嵌套数组
- 子命令有多个参数时,返回所有参数值组成的数组
- 兼容子命令组嵌套子命令的场景,递归处理层级参数
- 可选链
?.和空值合并运算符??避免空引用报错
内容的提问来源于stack exchange,提问作者NTM Nathan
相关产品推荐
相关产品推荐

