Discord.js旧API失效时如何查询特定角色的持有成员数量
问题说明
你使用的是Discord.js v11及更早版本的API,从v12版本开始相关方法已经被正式移除,具体变动如下:
Guild.fetchMembers()接口被废弃,新版本不再支持该手动全量拉取成员的方法,同时v13+版本需要在开发者后台和代码中手动开启GUILD_MEMBERS网关意图才能访问成员数据- 数据集合类(如
roles、members)的get()方法被移除,所有集合操作现在都需要先访问cache属性再执行查询
正确实现方案
首先需要在客户端初始化时开启必要的网关权限,示例如下:
const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent, GatewayIntentBits.GuildMembers // 必须开启该权限才能正常获取成员数据 ] });
原message事件也已在v13+版本废弃,替换为messageCreate事件,功能代码如下:
client.on('messageCreate', async (message) => { // 过滤机器人自身发送的消息 if (message.author.bot) return; const roleID = '3933783737379'; // 从缓存中查询目标角色 const targetRole = message.guild.roles.cache.get(roleID); if (!targetRole) { return message.channel.send("未找到指定角色"); } // 统计持有该角色的成员数量 const memberCount = targetRole.members.size; message.channel.send(`${memberCount} 名成员拥有该角色!`); });
缓存不全问题处理
如果出现成员计数不准的情况,可主动拉取全量成员后再统计,代码如下:
client.on('messageCreate', async (message) => { if (message.author.bot) return; const roleID = '3933783737379'; // 主动拉取服务器全量成员更新缓存 await message.guild.members.fetch(); const targetRole = message.guild.roles.cache.get(roleID); if (!targetRole) return message.channel.send("未找到指定角色"); const memberCount = targetRole.members.size; message.channel.send(`${memberCount} 名成员拥有该角色!`); });
内容的提问来源于stack exchange,提问作者tan shi yu
相关产品推荐
相关产品推荐

