报错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
相关产品推荐
相关产品推荐

