Discord.js v13版本inviter返回null的代码异常问题问询
问题原因
- 缺少必要的网关意图:Discord.js v13 开始强制要求显式配置网关意图才能获取对应数据,邀请码相关功能必须在 Discord 开发者后台开启
GuildInvites意图,同时客户端初始化时传入对应意图参数,否则邀请码的inviter字段会直接返回 null。 - 邀请码拉取参数缺失:v13 中
guild.invites.fetch()默认不会拉取完整的邀请人信息和使用次数统计,需要手动传入配置参数才能获取完整数据。 - 本地邀请码缓存未及时更新:你代码中依赖本地存储的
client.invites缓存做匹配,如果没有监听邀请码创建/删除事件更新缓存,会出现匹配失败 fallback 到 vanity URL 的情况,而 vanity 链接本身无邀请人属性,自然返回 null。 - 权限不足:机器人需要持有服务器的
Manage Guild权限,否则无法拉取完整的邀请码列表和邀请人信息。
解决步骤
1. 配置客户端初始化意图
在初始化客户端时传入必要的意图参数:
const { Client, Intents } = require('discord.js'); const client = new Client({ intents: [ Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MEMBERS, // 监听成员加入事件必须开启 Intents.FLAGS.GUILD_INVITES // 拉取邀请码数据必须开启 ] });
同时需要在 Discord 开发者后台对应应用的「Bot」设置页,开启 Server Members Intent 和 Guild Invites Intent 开关。
2. 初始化邀请码缓存并监听更新
在客户端 ready 事件中初始化全量邀请码缓存,同时监听邀请码变动事件更新缓存:
client.on('ready', async () => { client.invites = new Map(); // 拉取所有已加入服务器的邀请码存入缓存 for (const guild of client.guilds.cache.values()) { try { const invites = await guild.invites.fetch({ withCounts: true }); client.invites.set(guild.id, new Map(invites.map(i => [i.code, i]))); } catch (err) { // 无权限拉取的服务器跳过处理 } } }); // 监听新邀请码创建,更新缓存 client.on('inviteCreate', (invite) => { const guildInvites = client.invites.get(invite.guild.id) || new Map(); guildInvites.set(invite.code, invite); client.invites.set(invite.guild.id, guildInvites); }); // 监听邀请码删除,更新缓存 client.on('inviteDelete', (invite) => { const guildInvites = client.invites.get(invite.guild.id); if (guildInvites) guildInvites.delete(invite.code); });
3. 调整成员加入时的邀请码匹配逻辑
修改邀请码拉取参数,同时单独处理 vanity URL 场景:
const guildInvites = client.invites.get(member.guild.id) || new Map(); // 拉取邀请码时传入 withCounts 参数获取使用次数和邀请人信息 const invites = await member.guild.invites.fetch({ withCounts: true, cache: true }); // 匹配被使用的邀请码 const usedInvite = invites.find((x) => guildInvites.has(x.code) && guildInvites.get(x.code).uses < x.uses) || guildInvites.find((x) => !invites.has(x.code)); let inviter = null; if (usedInvite) { inviter = usedInvite.inviter; } else { // 兜底判断是否通过服务器 vanity 链接加入,该场景默认无邀请人 const vanityData = await member.guild.fetchVanityData().catch(() => null); // 若需要统计 vanity 加入的情况可在此处单独处理,该场景inviter固定为null属于正常情况 } // 匹配完成后更新本地缓存 client.invites.set(member.guild.id, new Map(invites.map(i => [i.code, i])));
注意:如果成员是通过好友直接拉入服务器、或者通过服务器发现页加入,无对应邀请码记录,inviter 返回 null 属于正常现象。
内容的提问来源于stack exchange,提问作者user16742787
相关产品推荐
相关产品推荐

