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

Discord机器人发送欢迎消息后崩溃:Cannot read properties of undefined (reading 'send')

解决Discord机器人guildMemberAdd事件偶发崩溃问题(Cannot read properties of undefined (reading 'send'))

问题原因

偶发崩溃的核心是代码中member.guild.channels.cache.get(client.config.welcomeChannel)偶尔会返回undefined,此时调用.send()就会触发Cannot read properties of undefined (reading 'send')错误。这种情况通常是因为:

  • 机器人刚启动,频道缓存还未完全同步
  • 服务器频道结构变动后,本地缓存未及时更新
  • 配置的welcomeChannelID存在临时不可用的情况

解决方案

1. 先校验频道存在性再发送消息

在调用send()前先判断频道是否存在,避免直接访问undefined的属性:

client.on('guildMemberAdd', member => {
  console.log('User @' + member.user.tag + ' has joined the server!');

  const welcomepublic = new client.discord.EmbedBuilder()
    .setColor(client.config.mainColor)
    .setAuthor({
      name: client.config.botName,
      iconURL: client.user.avatarURL()
    })
    .setThumbnail(member.user.avatarURL())
    .setDescription(client.locales.other.joinPublicMessage.replace('USERNAME', '<@' + member.user.id + '>').replace('SERVERNAME', client.config.serverName))
    .setFooter({
      text: "Dev by Akaya",
      iconUrl: "https://i.imgur.com/PNK8rlZ.png"
    });

  // 先获取频道并校验
  const welcomeChannel = member.guild.channels.cache.get(client.config.welcomeChannel);
  if (!welcomeChannel) {
    console.error(`无法找到欢迎频道,ID: ${client.config.welcomeChannel}`);
    return;
  }
  welcomeChannel.send({ embeds: [welcomepublic] });

  // 角色添加也加错误捕获
  const role = client.config.roleJoin;
  member.roles.add(role).catch(err => console.error("添加角色失败:", err));
});

2. 使用fetch强制获取频道(推荐)

channels.fetch()会优先从缓存取数据,缓存没有时直接请求Discord API拉取,能彻底解决缓存缺失的问题。需要配合异步处理:

client.on('guildMemberAdd', async member => {
  console.log('User @' + member.user.tag + ' has joined the server!');

  const welcomepublic = new client.discord.EmbedBuilder()
    .setColor(client.config.mainColor)
    .setAuthor({
      name: client.config.botName,
      iconURL: client.user.avatarURL()
    })
    .setThumbnail(member.user.avatarURL())
    .setDescription(client.locales.other.joinPublicMessage.replace('USERNAME', '<@' + member.user.id + '>').replace('SERVERNAME', client.config.serverName))
    .setFooter({
      text: "Dev by Akaya",
      iconUrl: "https://i.imgur.com/PNK8rlZ.png"
    });

  try {
    // 强制获取频道
    const welcomeChannel = await member.guild.channels.fetch(client.config.welcomeChannel);
    if (!welcomeChannel) {
      console.error(`欢迎频道ID ${client.config.welcomeChannel} 不存在`);
      return;
    }
    await welcomeChannel.send({ embeds: [welcomepublic] });
  } catch (err) {
    console.error("发送欢迎消息失败:", err);
  }

  // 角色添加也做异步错误处理
  try {
    const role = client.config.roleJoin;
    await member.roles.add(role);
  } catch (err) {
    console.error("添加角色失败:", err);
  }
});

3. 额外检查项

  • 确认机器人拥有目标频道的发送消息、嵌入链接权限
  • 确认机器人拥有管理角色权限,且要添加的角色ID有效、权限等级低于机器人角色
  • 定期核对client.config.welcomeChannel和client.config.roleJoin的配置是否正确

内容的提问来源于stack exchange,提问作者arthur hubaud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:05:23