Discord.js机器人执行accept命令触发TypeError:无法读取undefined的run属性
错误原因
你遇到的报错核心原因是client.commands集合中不存在键为accept的命令对象,调用get("accept")返回undefined,尝试访问undefined的run属性就触发了类型错误。具体触发逻辑如下:
- 你的命令文件导出的配置项中
name字段值为dm,入口文件遍历命令存储时,是用command.name作为集合的键存入client.commands,所以你实际存进去的命令键是dm而非accept - 入口文件的命令匹配逻辑里,你判断用户输入的命令是
accept时,强行调用键为accept的命令的run方法,自然找不到对应对象
解决方案
- 对齐命令标识,二选一即可:
- 如果你想要用户用
-accept触发该命令,直接修改命令文件中导出的name字段值为accept即可 - 如果你想要用户用
-dm触发该命令,修改入口文件的对应代码:// 原来的判断 if(command === "accept") { client.commands.get("accept").run(client, message, args); } // 修改为 if(command === "dm") { client.commands.get("dm").run(client, message, args); }
- 如果你想要用户用
- 修复命令文件中的语法错误
你命令文件中if(message.content.includes(-a))存在语法问题,-a是字符串需要加引号,修改为:if(message.content.includes("-a")) - 可选优化:增加命令存在性判断,避免后续新增命令时重复出现类似崩溃问题,修改入口文件的命令调用逻辑:
if(!message.content.startsWith(prefix) || message.author.bot) return; const args = message.content.slice(prefix.length).split(/ +/); const command = args.shift().toLowerCase() // 先校验命令存在再调用 const targetCommand = client.commands.get(command) if (targetCommand) { targetCommand.run(client, message, args) }
内容的提问来源于stack exchange,提问作者DiscordJS
相关产品推荐
相关产品推荐

