Discord机器人报错ReferenceError: Guild is not defined求助
解决Discord.js-Commando机器人的
ReferenceError: Guild is not defined问题 你的错误根源非常明确——在guildMemberRemove事件的处理逻辑里,你直接使用了guild.name,但guild这个变量在当前回调函数的作用域里根本没有被定义!
问题分析
当用户触发guildMemberRemove事件时,Discord.js会给回调函数传入一个member对象,这个对象本身就包含了它所属服务器的信息,通过member.guild就能访问到对应的服务器实例,不需要额外声明guild变量。
另外还有个小细节需要修正:你在代码最顶部定义的now变量只会在机器人启动时获取一次时间,成员离开时打印的永远是启动时间,而不是实际离开的时间,所以要把时间的初始化放到事件回调内部。
修复后的guildMemberRemove事件代码
bot.on("guildMemberRemove", member => { const now = new Date(); // 每次触发事件时获取当前时间 console.log(`${member.user.username} left from ${member.guild.name} at ${now}. Just watch the logs on the server`); });
完整优化后的代码
顺便帮你简化了消息判断的冗余逻辑(用数组和includes减少重复if),同时修复了核心问题:
const commando = require('discord.js-commando'); const bot = new commando.Client(); bot.registry.registerGroup('random', 'Random'); bot.registry.registerGroup('reply', 'Reply'); bot.registry.registerDefaults(); bot.registry.registerCommandsIn(__dirname + "/commands"); bot.on("ready", () => { console.log(`Bot has started, with ${bot.users.size} users, in ${bot.channels.size} channels of ${bot.guilds.size} guilds.`); bot.user.setActivity(`Serving ${bot.guilds.size} servers`); }); bot.on("guildCreate", guild => { console.log(`New guild joined: ${guild.name} (id: ${guild.id}). This guild has ${guild.memberCount} members!`); bot.user.setActivity(`Serving ${bot.guilds.size} servers`); }); // 修复核心问题的事件处理 bot.on("guildMemberRemove", member => { const now = new Date(); console.log(`${member.user.username} left from ${member.guild.name} at ${now}. Just watch the logs on the server`); }); bot.on("message", async message => { // 避免机器人自己触发消息 if (message.author.bot) return; const optionsGreetings = ["Hellouu", "Heyy", "Hi there", "How ya doing?", "LETS GO DUDE"]; const optionsHowAreYou = ["I had a bad day, whats about you, how are you doing?", "Robots have no feelings but whats about you?", "I am pretty good!", "I am doing fine, thanks, and you?", "Im good, how are you?"]; const responseGreetings = optionsGreetings[Math.floor(Math.random()*optionsGreetings.length)]; const responseHowAreYou = optionsHowAreYou[Math.floor(Math.random()*optionsHowAreYou.length)]; // 简化问候语判断 const greetings = ['hello', 'hi', 'hey']; if (greetings.includes(message.content.toLowerCase())) { message.channel.send(responseGreetings); } // 简化"How are you?"判断 if (message.content.toLowerCase() === 'how are you?') { message.channel.send(responseHowAreYou); } // 其他命令 switch(message.content.toLowerCase()) { case 'ping': message.reply(`API Latency is ${Math.round(bot.ping)}ms`); break; case 'why': case 'why?': message.channel.send(`Because!`); break; } }); bot.login('MY_TOKEN');
额外提示
- 加入了
if (message.author.bot) return;可以避免机器人响应自己发送的消息,减少无效逻辑 - 用
toLowerCase()统一消息的大小写,不管用户输入大写还是小写都能触发响应 - 用
switch和数组includes简化了大量重复的if判断,让代码更整洁
内容的提问来源于stack exchange,提问作者SynSpree
相关产品推荐
相关产品推荐

