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

报错Cannot read property 'cache' of undefined,求Discord机器人用户统计修复方案

解决Discord机器人获取用户总数时的"Cannot read property 'cache' of undefined"报错

嘿,我刚看完你的问题和代码,一眼就发现了问题所在——你对guild.members.fetch()的返回值理解错啦!

问题根源

你写的这段代码里,guild.members.fetch()是异步请求,它返回的Promise最终会resolve成该服务器的成员集合(Collection<Snowflake, GuildMember>),而不是你以为的Guild对象。所以当你写g.members.cache的时候,g本身就是成员列表,根本没有members这个属性,自然就抛出了"Cannot read property 'cache' of undefined"的错误。

修复方案 + 优化代码

我帮你把代码改得更简洁高效,还能实现你想要的统计所有服务器用户总数、更新机器人状态的需求:

// 统计所有服务器的用户总数并更新机器人状态
async function updateBotStatus() {
  try {
    // 获取机器人加入的所有服务器数量
    const totalGuilds = bot.guilds.cache.size;
    // 并行获取所有服务器的成员集合
    const allMemberCollections = await Promise.all(
      bot.guilds.cache.map(guild => guild.members.fetch())
    );
    // 汇总所有服务器的用户数
    const totalUsers = allMemberCollections.reduce((sum, members) => sum + members.size, 0);
    
    // 更新机器人状态
    await bot.user.setActivity(
      `我正在监控${totalGuilds}个服务器中的${totalUsers}名用户`,
      { type: 'WATCHING' }
    );
    console.log(`状态更新成功:监控${totalGuilds}个服务器中的${totalUsers}名用户`);
  } catch (error) {
    console.error(`更新状态时出错:`, error);
  }
}

// 可以在机器人就绪后调用这个函数
bot.on('ready', () => {
  console.log(`机器人${bot.user.tag}已上线`);
  updateBotStatus();
  // 可以设置定时更新,比如每小时更新一次
  setInterval(updateBotStatus, 3600000);
});

为什么这么改?

  • 异步处理更清晰:用async/await替代嵌套的.then(),代码逻辑一目了然,避免回调地狱。
  • 高效统计用户数:直接用成员集合的size属性获取用户数,不用手动遍历计数,性能更好。
  • 确保统计完整:用Promise.all并行处理所有服务器的成员请求,保证所有数据都获取到后再更新状态,不会出现统计不全的情况。
  • 错误处理更完善:包裹了try/catch,哪怕某个服务器获取成员失败,也不会导致整个流程崩溃,还能看到具体错误信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 22:27:32