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

Discord.js开发遇TypeError: Cannot read property 'filter' of undefined求助

问题根因

报错指向的client.members.filter调用逻辑存在多个底层问题:

  • client全局对象下没有members属性,discord.js的成员、角色数据都挂载在具体的服务器(Guild)实例下
  • client.channels.fetch()、client.guilds.fetch()都是异步方法,直接赋值拿到的是Promise对象,不是真实的频道/服务器实例,调用实例方法会直接报错
  • 代码中出现未定义变量codeMonkeys,你实际定义的对应变量是onlineStaff
  • 未做空值校验,当实例、数据未加载完成时调用方法就会抛出异常

修复后完整代码

const Discord = require('discord.js');
const config = require('../settings/config.js');
const client = require('../index.js').client;
const Guild_ID = require('../settings/configuration').BOT_SETTINGS;

// 提前定义变量存储真实实例
let targetGuild, totalUsersChannel, onlineUsersChannel, onlineStaffChannel;

// 初始化加载所有需要的实例
async function initInstances() {
  try {
    // 拿到目标服务器实例
    targetGuild = await client.guilds.fetch('802700035544317972');
    console.log(targetGuild.name);
    // 拿到三个统计频道实例
    totalUsersChannel = await client.channels.fetch('859879787614437427');
    onlineUsersChannel = await client.channels.fetch('859879824403202059');
    onlineStaffChannel = await client.channels.fetch('859879875531374672');
  } catch (err) {
    console.error('初始化实例失败:', err);
  }
}

// 客户端就绪后再执行初始化和定时任务
client.on('ready', async () => {
  await initInstances();
  // 30秒执行一次统计更新
  setInterval(async () => {
    console.log('Getting stats update..');
    // 空值判断,实例加载完成再执行后续逻辑
    if (!targetGuild || !totalUsersChannel || !onlineUsersChannel || !onlineStaffChannel) {
      return console.log('实例未加载完成,跳过本次更新');
    }

    // 从服务器实例下获取成员、角色数据
    const userCount = targetGuild.memberCount;
    // 增加空值判断,避免成员列表未缓存时报错
    const onlineCount = targetGuild.members.cache?.filter(m => m.presence?.status === 'online').size || 0;
    const staffRole = targetGuild.roles.cache.get('802711739006582846');
    const coderCount = staffRole?.members.size || 0;

    console.log("Total Users: " + userCount);
    console.log("Online Users: " + onlineCount);
    console.log("Online Staff: " + coderCount);

    // 更新频道名称
    try {
      await totalUsersChannel.setName("Total Users: " + userCount);
      await onlineUsersChannel.setName("Online Users: " + onlineCount);
      await onlineStaffChannel.setName("Online Staff: " + coderCount);
      console.log('所有统计频道更新完成');
    } catch (err) {
      console.error('更新频道名称失败:', err);
    }
  }, 30000);
});

额外配置要求

你需要在初始化Discord Client的代码(index.js)中开启对应权限意图,否则无法正常获取成员状态与列表:

const client = new Discord.Client({
  intents: [
    Discord.Intents.FLAGS.GUILDS,
    Discord.Intents.FLAGS.GUILD_MEMBERS,
    Discord.Intents.FLAGS.GUILD_PRESENCES
  ]
})

同时需要在Discord开发者后台的Bot设置页,开启Server Members Intent和Presence Intent两个权限开关。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 17:51:03