Discord.js v12.5.3邀请日志报错Cannot read property 'fetch' of undefined如何解决
问题根因
你使用的Discord.js v12.5.3版本不支持guild.invites.fetch()写法,该API是v13及以上版本新增的调用方式,v12版本获取服务器邀请列表的原生方法为guild.fetchInvites(),你的代码调用了不存在的guild.invites属性,所以会抛出无法读取undefined的fetch属性的错误。
修复方案
替换代码中两处调用邀请列表的逻辑即可:
- 替换ready事件中的邀请拉取逻辑
- 替换guildMemberAdd事件中的邀请拉取逻辑
修改后的完整可运行代码如下:
const invites = new Map(); const wait = require("timers/promises").setTimeout; client.on("ready", async() => { await wait(1000); client.guilds.cache.forEach(async(guild) => { // 修改处:v12版本使用guild.fetchInvites()拉取邀请列表 const firstInvites = await guild.fetchInvites(); invites.set(guild.id, new Map(firstInvites.map((invite) => [invite.code, invite.uses]))); }); }); client.on("inviteDelete", (invite) => { invites.get(invite.guild.id).delete(invite.code); }); client.on("inviteCreate", (invite) => { invites.get(invite.guild.id).set(invite.code, invite.uses); }); client.on("guildMemberAdd", member => { // 修改处:v12版本使用guild.fetchInvites()拉取邀请列表 member.guild.fetchInvites().then(newInvites => { const oldInvites = invites.get(member.guild.id); const invite = newInvites.find(i => i.uses > oldInvites.get(i.code)); const inviter = client.users.cache.get(invite.inviter.id); const logChannel = member.guild.channels.cache.find(channel => channel.name === "bot-testing"); inviter ? logChannel.send(`${member.user.tag} joined using invite code ${invite.code} from ${inviter.tag}. Invite was used ${invite.uses} times since its creation.`) : logChannel.send(`${member.user.tag} joined but I couldn't find through which invite.`); }); });
额外注意事项
- 初始化Client实例时需要开启对应网关意图,否则无法接收邀请相关事件和成员加入事件,示例初始化配置:
const Discord = require('discord.js'); const client = new Discord.Client({ ws: { intents: ['GUILDS', 'GUILD_INVITES', 'GUILD_MEMBERS'] } });
- 你需要前往Discord开发者后台的Bot管理页面,开启
Server Members Intent权限开关,否则无法接收成员加入事件。 - 确认Bot在对应服务器拥有
管理邀请(Manage Invites)权限,否则无法拉取服务器邀请列表。
内容的提问来源于stack exchange,提问作者BlurryMeal
相关产品推荐
相关产品推荐

