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

Discord.js 设置的服务器成员计数状态成员退出时不更新问题

问题原因
  • 你统计成员数用的client.users.cache是Discord.js维护的全局用户缓存,用户退出单服务器时不会从该缓存中删除记录(该用户可能和机器人共存于其他服务器),所以统计值只会增加不会减少。
  • 你当前统计的是机器人所有关联用户的总量,并不是单目标服务器的成员数量,本身统计逻辑不符合需求。
  • 如果未开启GUILD_MEMBERS网关特权意图,机器人无法同步全量成员数据、也接收不到成员退出事件,会进一步导致缓存数据不准。
解决方案

第一步:开启成员权限意图

前往Discord开发者后台的机器人管理页,在「Privileged Gateway Intents」区域打开Server Members Intent开关。

第二步:修改初始化配置

初始化客户端时声明所需意图,以discord.js v14为例:

const { Client, IntentsBitField } = require('discord.js');
const client = new Client({
  intents: [
    IntentsBitField.Flags.Guilds,
    IntentsBitField.Flags.GuildMembers,
  ]
});
const TARGET_GUILD_ID = '替换为你的服务器ID'; // 要统计成员的目标服务器ID
const prefix = '你的命令前缀';

第三步:修改状态更新逻辑

改用目标服务器的成员缓存统计数量,同时首次启动时主动拉取全量成员数据保证缓存准确:

client.on('ready', async () => {
    // 首次启动拉取目标服务器全量成员,更新缓存
    const targetGuild = client.guilds.cache.get(TARGET_GUILD_ID);
    if (targetGuild) await targetGuild.members.fetch();
    
    client.user.setStatus('dnd');

    function picksStatus() {
        const userCount = targetGuild ? targetGuild.members.cache.filter(m => !m.user.bot).size : 0;
        const status = [`mit ${userCount} User`, `${prefix}help für Hilfe`];
        const statusRotate = Math.floor(Math.random() * status.length);
        client.user.setActivity(status[statusRotate], {
            type: 'PLAYING'
        })
    }

    setInterval(picksStatus, 5000);

    console.log(`Logged in as ${client.user.tag}`);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 20:12:02