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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:00:03