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

Discord.js v13.7.0中guildMemberRemove事件不触发修复方法

问题定位

你的guildMemberAdd事件正常但guildMemberRemove不触发,核心原因通常是以下几点,按优先级排查:

  • 未在Discord开发者后台开启GUILD_MEMBERS对应的特权开关:代码里声明意图只是第一步,成员相关事件属于特权网关意图,必须手动在开发者面板开启权限,否则服务端不会推送成员离开事件给机器人。
  • 事件回调缺少空值判断和错误捕获:你直接调用client.channels.cache.get(memberChannelID).setName(),如果目标频道未加载到本地缓存,代码会直接抛出未捕获异常中断执行,看起来就像事件没触发。
  • 存在无效代码:你在客户端初始化后、登录前写的const guild = client.guilds.cache.get(guildID)是无效代码,执行时客户端还未和网关建立连接,缓存为空,这行永远拿到undefined,容易引发后续逻辑问题。
修复步骤
  1. 开启特权网关意图
    • 打开Discord开发者门户,进入你的机器人对应应用页
    • 切换到Bot标签页,下拉到Privileged Gateway Intents区域
    • 打开Server Members Intent右侧的开关,保存更改
  2. 补全代码容错逻辑,删除无效代码
    • 删除顶层无效的guild变量定义
    • 两个成员事件里先判断目标频道是否存在,再加错误捕获,避免抛错中断进程
    • 可选:在ready事件里先执行一次频道名更新,保证机器人上线时统计数据准确
  3. 权限与规则校验
    • 确认机器人在成员统计频道所在分类、频道本身,拥有查看频道、管理频道权限,否则改名操作会被Discord接口拒绝
    • 注意频道改名有速率限制:单个频道每10分钟最多修改2次名字,短时间内反复进出服务器测试会触发限流,导致改名失败,不要连续测试
修正后可运行代码
const { token, guildID, memberChannelID } = require('./config.json');
const { Client, Intents } = require('discord.js');

const client = new Client({ 
    intents: [
        Intents.FLAGS.GUILDS, 
        Intents.FLAGS.GUILD_MESSAGES, 
        Intents.FLAGS.GUILD_MEMBERS, 
        Intents.FLAGS.GUILD_PRESENCES
    ] 
});
const prefix = '?';

// 抽离公共的更新成员数逻辑,避免重复代码
async function updateMemberCount(guild) {
    const countChannel = client.channels.cache.get(memberChannelID);
    if (!countChannel) return console.log(`未找到ID为${memberChannelID}的统计频道`);
    try {
        await countChannel.setName(`Total Members: ${guild.memberCount.toLocaleString()}`);
        console.log('成员统计频道名更新成功');
    } catch (err) {
        console.log('更新频道名失败:', err);
    }
}

client.on('messageCreate', message => {
    if (!message.content.startsWith(prefix) || message.author.bot) return;

    const args = message.content.slice(prefix.length).split(/ +/);
    const command = args.shift().toLowerCase();

    if (command === 'ping') {
        message.reply('pong!');
    } else if (command === 'help') {
        message.reply('**Commands: ** ?ping, ?membercount');
    } else if (command === 'membercount') {
        message.reply(`There are ${message.guild.memberCount} members in this server!`);
    }
});

client.on('guildMemberAdd', async (member) => {
    updateMemberCount(member.guild);
})

client.on('guildMemberRemove', async (member) => {
    updateMemberCount(member.guild);
})

client.once('ready', () => {
    console.log("EGLX BOT IS ONLINE")
    // 上线时先更新一次统计
    const targetGuild = client.guilds.cache.get(guildID);
    if (targetGuild) updateMemberCount(targetGuild);
})

client.login(token);

测试提示:如果要验证离开事件,不要用机器人自己的账号测试,可以用小号进服再退服观察控制台日志,避免权限、缓存等特殊情况干扰判断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:15:39