Discord.JS报错Cannot read property 'members' of undefined解决求助
Discord机器人统计功能报错修复方案
报错
TypeError: Cannot read property 'members' of undefined的核心原因是代码执行时guild对象为undefined,无法读取其下的members属性。
现存问题列表
guild对象的获取逻辑写在定时器外部,函数初始化时bot可能还未完成登录、服务器缓存未加载,导致client.guilds.cache.get()返回undefined,且后续定时器运行时不会重新获取guild对象,一直报错。totalUsers和onlineUsers直接引入了配置文件,配置文件中存储的是频道ID字符串,没有转换为实际的频道对象,直接调用.setName()方法会触发后续报错。- 未开启Discord机器人所需的特权网关意图,导致无法获取服务器成员、在线状态数据。
- 新版Discord.JS中成员列表需要主动拉取,直接访问
guild.members无法获取完整数据,且未处理成员presence为空的边界情况。
修复步骤
第一步:开启网关权限
首先进入Discord开发者平台的机器人管理页面,在「Privileged Gateway Intents」板块开启以下两个权限:
- Server Members Intent
- Presence Intent
同时在机器人初始化代码中配置对应的意图:
const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, // 基础服务器权限 GatewayIntentBits.GuildMembers, // 读取服务器成员权限 GatewayIntentBits.GuildPresences // 读取成员在线状态权限 ] });
第二步:修改Stats.js代码
修复后的完整代码如下:
function updateStats(client) { const Discord = require('discord.js'); const settings = require("../settings/configuration"); setInterval(async function() { try { console.log('Getting stats update..') // 每次执行定时任务时重新获取服务器对象,避免缓存未加载问题 const guild = client.guilds.cache.get(settings.BOT_SETTINGS.Guild_ID); if (!guild) return console.log('未找到对应服务器,跳过本次统计更新'); // 拉取完整成员列表 await guild.members.fetch(); // 获取统计频道对象 const totalUsersChannel = guild.channels.cache.get(settings.stats.totalUsers); const onlineUsersChannel = guild.channels.cache.get(settings.stats.onlineUsers); if (!totalUsersChannel || !onlineUsersChannel) return console.log('未找到统计频道,跳过本次更新'); // 计算成员数和在线人数 const userCount = guild.memberCount; const onlineCount = guild.members.cache.filter(m => m.presence?.status === 'online').size; console.log("Total Users: " + userCount); console.log("Online Users: " + onlineCount); // 更新频道名称 await totalUsersChannel.setName("Total Users: " + userCount); console.log(`总人数频道已更新为: Total Users: ${userCount}`); await onlineUsersChannel.setName("Online Users: " + onlineCount); console.log(`在线人数频道已更新为: Online Users: ${onlineCount}`); } catch (err) { console.error('统计更新出错:', err); } }, 120000) // 每2分钟更新一次 } module.exports = { updateStats }
第三步:权限确认
确认机器人在目标服务器拥有「管理频道」权限,否则无法修改频道名称。
内容的提问来源于stack exchange,提问作者Delta_Bravo92
相关产品推荐
相关产品推荐

