Discord Slash Command 获取剔除Bots的服务器成员数始终返回1问题
问题成因
- 核心原因是Discord.js v13及以上版本默认不会缓存服务器全量成员数据,直接读取
members.cache时,缓存中仅包含你的Bot自身账号,所以过滤后大小始终为1。具体触发场景分为四类:- 未开启
GuildMembers特权网关意图,Discord后台不会向你的Bot推送成员数据 - 初始化Client时未声明
GuildMembers意图,Bot不会处理成员相关的网关事件 - 直接读取本地缓存,没有主动拉取全量成员数据,缓存未命中其他成员信息
- Bot缺少服务器的「查看成员」权限,无法获取其他成员数据
- 未开启
排查修复步骤
- 开启Discord开发者后台特权意图
进入Discord开发者平台对应应用的「Bot」设置页,找到Privileged Gateway Intents区域,打开Server Members Intent开关。 - 修正Client初始化的意图配置
初始化Bot客户端时必须显式声明Guilds和GuildMembers意图,示例代码:const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, // 斜杠命令必需的基础意图 GatewayIntentBits.GuildMembers // 成员数据读取必需意图 ] }); - 替换缓存读取逻辑为主动拉取成员
不要直接读取cache属性,改用fetch()主动拉取全量成员后再过滤,修正后的统计代码:// 注意:fetch是异步方法,需要在async函数内调用 const allMembers = await interaction.guild.members.fetch(); const real_members = allMembers.filter((member) => !member.user.bot).size; - 权限校验
确认Bot在对应服务器中被授予「查看成员」权限,避免权限不足导致无法拉取成员列表。
内容的提问来源于stack exchange,提问作者EckigerLuca
相关产品推荐
相关产品推荐

