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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 13:54:04