You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord机器人guildMemberAdd事件报错:guild未定义问题求助

问题排查与解决方案:"guild is not defined" 错误

错误原因

你在控制台输出的代码里直接使用了guild变量,但这个变量从未被定义过。在guildMemberAdd事件的回调函数中,你能直接获取到的是member对象——而服务器(Guild)的所有信息,都需要通过member.guild来访问,因为每个成员都隶属于一个服务器,这个关联关系已经包含在member对象里了。

另外我还发现代码里有个小语法错误:ctx.font = (canvas, ${member.username}!);这行完全不符合字体设置的格式,会导致绘制用户名时失效,也需要一并修正。

解决方案

  1. 把控制台输出里的guild.name和guild.memberCount替换为member.guild.name和member.guild.memberCount,直接通过成员对象关联到所属服务器;
  2. 修正错误的字体设置代码,改为标准的ctx.font = "字体大小 字体类型";格式;
  3. 顺便优化了变量声明方式(用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:30:16