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

discord.js机器人加入无系统消息频道的新服务器时如何发送消息

问题原因分析

  • 原有遍历逻辑的遍历对象错误:client.guilds.cache存储的是机器人加入的所有服务器实例,不是当前目标服务器的频道列表,因此无法匹配到需要的频道
  • 若使用的是discord.js v13及以上版本,文本频道的枚举值已从text变更为GUILD_TEXT,旧的类型判断会失效
  • 缺少异步错误捕获,就算频道存在如果突然丢失权限也会触发未处理的报错

修复后的完整代码

// guild 是 guildCreate 事件回调中拿到的新加入服务器对象
client.on('guildCreate', async (guild) => {
  try {
    // 优先使用系统频道发送
    if (guild.systemChannelId) {
      await guild.systemChannel.send("Thank you for invite!");
      console.log('Bot Joined new server! Message sent to system channel.');
      return;
    }

    // 系统频道不存在时,查找第一个有权限发送的文本频道
    const availableChannel = guild.channels.cache.find(channel => 
      // 适配不同版本的类型判断,可根据自己的discord.js版本二选一
      // v12及以下用 channel.type === 'text'
      channel.type === 'GUILD_TEXT' 
      && channel.permissionsFor(guild.me).has('SEND_MESSAGES')
    );

    if (availableChannel) {
      await availableChannel.send("Thanks for inviting me");
      console.log('Bot Joined new server! Message sent to available text channel.');
    } else {
      console.log('Bot Joined new server! No available channel to send welcome message.');
    }
  } catch (err) {
    console.error('Failed to send welcome message:', err);
  }
});

补充说明

  • 用find()方法替代forEach()遍历,匹配到第一个符合条件的频道就会停止查找,效率更高,也不会出现向多个频道重复发消息的问题
  • 加了async/await和try/catch包裹所有发送逻辑,避免出现未捕获的异步报错导致机器人崩溃
  • 加了无可用频道的兜底日志,方便排查问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 18:21:02