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

