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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:24:07