Discord机器人guildMemberAdd事件报错:guild未定义问题求助
问题排查与解决方案:"guild is not defined" 错误
错误原因
你在控制台输出的代码里直接使用了guild变量,但这个变量从未被定义过。在guildMemberAdd事件的回调函数中,你能直接获取到的是member对象——而服务器(Guild)的所有信息,都需要通过member.guild来访问,因为每个成员都隶属于一个服务器,这个关联关系已经包含在member对象里了。
另外我还发现代码里有个小语法错误:ctx.font = (canvas, ${member.username}!);这行完全不符合字体设置的格式,会导致绘制用户名时失效,也需要一并修正。
解决方案
- 把控制台输出里的
guild.name和guild.memberCount替换为member.guild.name和member.guild.memberCount,直接通过成员对象关联到所属服务器; - 修正错误的字体设置代码,改为标准的
ctx.font = "字体大小 字体类型";格式; - 顺便优化了变量声明方式(用
const替代不必要的var)和随机数计算逻辑,让代码更规范简洁。
修正后的完整代码
client.on("guildMemberAdd", async (member) => { const channel = member.guild.channels.cache.find((ch) => ch.name === "greetings"); if (!channel) return; const number = 31; const image = Math.floor(Math.random() * number) + 1; const rand = [ "Some retard just joined", "This looser just made it", "This cringe person just joined", "LMAO look who joined", "Incoming Pleb!!", "Another Degenerate", "Another Basement Dweller", "Welcome you Wanker!!!" ]; const choosen = rand[Math.floor(Math.random() * rand.length)]; const canvas = Canvas.createCanvas(700, 250); const ctx = canvas.getContext("2d"); const background = await Canvas.loadImage(`./welcome/${image}.png`); ctx.drawImage(background, 0, 0, canvas.width, canvas.height); ctx.strokeStyle = "#74037b"; ctx.strokeRect(0, 0, canvas.width, canvas.height); ctx.font = "35px sans-serif"; ctx.fillStyle = "#ffffff"; ctx.fillText(`${choosen}`, canvas.width / 3, canvas.height / 3.5); // 修正错误的font设置行 ctx.font = "30px sans-serif"; ctx.fillStyle = "#ffffff"; ctx.fillText(`${member.displayName}!`, canvas.width / 2.9, canvas.height / 1.8); ctx.beginPath(); ctx.arc(125, 125, 100, 0, Math.PI * 2, true); ctx.closePath(); ctx.clip(); const avatar = await Canvas.loadImage(member.user.displayAvatarURL({ format: "jpg" })); ctx.drawImage(avatar, 25, 25, 200, 200); const attachment = new Discord.MessageAttachment(canvas.toBuffer(), "welcome-image.png"); channel.send(attachment); // 修正guild引用,通过member对象获取所属服务器 console.log(`${member} was added to ${member.guild.name}\n Server now has: ${member.guild.memberCount}`); });
额外小提示
- 尽量使用
const和let替代var,避免变量提升带来的潜在问题; - 随机数生成
Math.floor(Math.random() * number) + 1和你原来的写法效果完全一致,但代码更简洁易读。
内容的提问来源于stack exchange,提问作者OmGiTsLaiL
相关产品推荐
相关产品推荐

