Discord.js v14:通过邀请获取的服务器显示为不可用
Discord.js 获取邀请对应公会显示不可用的问题
问题代码
guild.invites.fetch().then((invites) => { if (!invites.size) return message.channel.send('No invites found'); let allInvites = invites.forEach(async(e) => { var invGuild = await client.guilds.fetch(e.guild) if(!invGuild.available) {console.log("Server unavailable?"); return;} console.log('Premade Invite Code: https://discord.gg/' + e.code + " | Server: " + invGuild.name + " | Member Count: " + invGuild.memberCount) i++ }) }).then( async() => { if(i==0) { var channel = await client.channels.fetch(channelid) var invite = await channel.createInvite() console.log('No invites found, new invite: ' + invite.code) } })
问题描述
这段代码用于获取服务器的邀请链接,先检查是否存在邀请,再遍历所有邀请。遇到的问题是:通过var invGuild = await client.guilds.fetch(e.guild)或通过invGuild.id从客户端获取服务器时,服务器显示为不可用,但该邀请链接可正常使用,且e.guild能正确返回服务器ID。
简言之:从邀请对象e的e.guild获取到的服务器显示为不可用。
问题原因与解决方案
核心原因
- 机器人未加入目标公会:
client.guilds.fetch()仅能获取机器人已加入的公会。若邀请对应的公会机器人未加入,即便邀请有效,客户端也无法获取该公会的完整可用对象,invGuild.available会返回false。 - 不必要的重复获取:Discord.js的
Invite对象本身已携带公会基础信息(如id、name、memberCount等),无需再次调用client.guilds.fetch()。 - 异步遍历逻辑错误:
forEach不支持异步函数,会导致i的计数逻辑与后续then的执行顺序混乱;同时变量i未提前声明,会引发全局变量污染。
修复后的代码
// 提前声明计数变量,避免全局污染 let i = 0; guild.invites.fetch() .then(async (invites) => { if (!invites.size) { await message.channel.send('No invites found'); return; } // 使用Promise.all+map处理异步遍历,确保所有操作完成后再执行后续逻辑 await Promise.all(invites.map(async (e) => { // 直接使用Invite对象自带的guild属性获取基础信息 const invGuild = e.guild; if (!invGuild) { console.log(`无法获取邀请 ${e.code} 对应的公会信息`); return; } // 输出基础信息,无需依赖available状态 console.log(`Premade Invite Code: https://discord.gg/${e.code} | Server: ${invGuild.name} | Member Count: ${invGuild.memberCount || '未知'}`); i++; })); }) .then(async () => { if (i === 0) { try { const channel = await client.channels.fetch(channelid); const invite = await channel.createInvite(); console.log(`No invites found, new invite: ${invite.code}`); } catch (err) { console.error('创建邀请失败:', err); } } }) .catch(err => console.error('获取邀请列表失败:', err));
关键修改点
- 移除
client.guilds.fetch(e.guild),直接使用邀请对象自带的e.guild属性获取公会基础信息。 - 用
Promise.all+map替代forEach处理异步遍历,确保所有异步操作完成后再执行后续逻辑。 - 提前声明
i变量,避免全局变量污染。 - 添加错误捕获逻辑,处理获取频道、创建邀请过程中可能出现的异常。
- 针对机器人未加入的公会,仍能输出其基础信息,同时兼容
memberCount可能不存在的情况。
内容的提问来源于stack exchange,提问作者user19430065
相关产品推荐
相关产品推荐

