Discord Bot命令处理器报错:添加超2个命令时execute未定义
解决Discord Bot命令处理器"Cannot read property 'execute' of undefined"错误
这个错误的核心原因很明确:当你调用bot.commands.get('try').execute()时,找不到名为try的命令,所以get()返回了undefined,自然没法调用execute方法。结合你提供的代码和问题描述,我整理了几个关键的修复步骤:
1. 修正命令名称的匹配问题
看你提供的命令文件,你的命令name属性是"trying",但你调用的时候用的是bot.commands.get('try')——名称完全不匹配!这肯定会找不到命令。你需要确保:
- 命令文件里的
name属性值,和你调用get()时传入的字符串完全一致。
比如要么把命令文件里的name改成"try",要么把调用代码改成bot.commands.get('trying')。
2. 检查命令加载逻辑(关键!超过2个命令出问题的核心原因)
如果只有前2个命令能正常工作,新增命令就失效,大概率是你的命令加载代码没有正确遍历所有命令文件。你需要确保加载逻辑能读取命令目录下的所有.js文件,并把它们都添加到bot.commands集合里。
这里给你一个标准的命令加载示例代码,你可以对照修改:
const fs = require('fs'); const path = require('path'); const Discord = require('discord.js'); // 先确保bot.commands是一个Discord集合 bot.commands = new Discord.Collection(); // 指定你的命令文件夹路径(比如项目根目录下的commands文件夹) const commandsDir = path.join(__dirname, 'commands'); // 读取文件夹里所有.js文件 const commandFiles = fs.readdirSync(commandsDir).filter(file => file.endsWith('.js')); // 遍历所有命令文件,逐个加载到集合中 for (const file of commandFiles) { const filePath = path.join(commandsDir, file); const command = require(filePath); // 用命令的name属性作为key,把命令对象存入集合 bot.commands.set(command.name, command); }
3. 给命令执行添加错误防护
为了避免这种报错直接崩溃,你可以在执行命令前先做存在性检查,同时捕获执行时的错误:
// 假设你已经从消息里提取了命令名commandName const command = bot.commands.get(commandName); if (!command) { return message.reply('抱歉,这个命令不存在!'); } // 尝试执行命令并捕获错误 try { command.execute(bot, message, args, trymessage, tryrole); } catch (err) { console.error(err); message.reply('执行这个命令时出现了错误,请检查日志!'); }
4. 确认命令文件的存放位置
确保所有新增的命令文件都放在你指定的命令文件夹里,文件名后缀是.js,没有拼写错误或者放错目录的情况。
内容的提问来源于stack exchange,提问作者ali eren kahraman
相关产品推荐
相关产品推荐

