discord.js命令执行报错TypeError: 无法读取undefined的length属性
报错信息
if(command.permissions.length){ ^ TypeError: Cannot read properties of undefined (reading 'length')
故障原因
报错核心是代码执行到权限校验环节时,尝试读取command.permissions.length属性,但此时command本身为undefined,无法读取下属属性。
常见触发场景:
- 用户输入的指令名、别名没有匹配到注册在
client.commands里的任何指令,获取到的command为空 - 部分自定义指令文件没有配置
permissions字段,即使匹配到指令,也会因为permissions属性不存在触发同类报错 - 异常捕获逻辑位置错误:原本用来拦截「指令不存在」场景的try/catch放在了权限校验代码之后,根本拦不住前面的报错。
修复步骤
直接替换对应位置的代码即可:
- 获取指令后立刻做存在性校验,匹配不到指令直接返回,不执行后续逻辑:
const command = client.commands.get(cmd) || client.commands.find(a => a.aliases && a.aliases.includes(cmd)); // 新增:指令不存在直接返回提示 if (!command) return message.reply("❌| 未找到对应指令");
- 给权限判断加兜底逻辑,兼容未配置
permissions字段的指令:
将原来的权限判断行if(command.permissions.length){替换为:
// 仅当指令配置了permissions且为非空数组时,才执行权限校验 if(Array.isArray(command.permissions) && command.permissions.length){
- 给冷却时间加默认值兜底,避免未配置
cooldown字段的指令触发计算异常:
将原来的冷却时间计算行const cooldown_amount = (command.cooldown) * 1000;替换为:
// 未配置冷却时间时默认3秒,可根据需求自行调整默认值 const cooldown_amount = (command.cooldown || 3) * 1000;
改完重启机器人即可解决该报错。
内容的提问来源于stack exchange,提问作者Zw96042
相关产品推荐
相关产品推荐

