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,容易引发后续逻辑问题。
修复步骤
- 开启特权网关意图
- 打开Discord开发者门户,进入你的机器人对应应用页
- 切换到
Bot标签页,下拉到Privileged Gateway Intents区域 - 打开
Server Members Intent右侧的开关,保存更改
- 补全代码容错逻辑,删除无效代码
- 删除顶层无效的
guild变量定义 - 两个成员事件里先判断目标频道是否存在,再加错误捕获,避免抛错中断进程
- 可选:在
ready事件里先执行一次频道名更新,保证机器人上线时统计数据准确
- 删除顶层无效的
- 权限与规则校验
- 确认机器人在成员统计频道所在分类、频道本身,拥有
查看频道、管理频道权限,否则改名操作会被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
相关产品推荐
相关产品推荐

