如何在Discord.js机器人的选择菜单中查找并展示共同服务器?
Discord.js v13: 获取机器人与用户的共同服务器并动态生成选择菜单
我看到你在Discord.js v13环境下折腾获取共同服务器、动态生成选择菜单的问题,结合你的代码尝试和后续更新,这里整理出清晰的解决方案和问题复盘:
Q1.1 如何获取机器人所在所有服务器的guildID列表?
你最初的核心错误是在命令执行函数里新建了一个Client实例——你的命令已经运行在一个已登录的机器人上下文里,完全不需要重新创建客户端。直接用interaction.client就能访问当前机器人的实例,它已经缓存了所有机器人加入的服务器信息。
正确的获取方式:
// 获取机器人所有服务器的ID列表 const allGuildIds = interaction.client.guilds.cache.map(guild => guild.id); console.log(allGuildIds);
你之前控制台输出空数组,就是因为新建的Client还没完成登录和缓存加载,而interaction.client是已经就绪的实例。
Q1.2 如何查找与interaction.user的共同服务器?
要判断用户是否在某服务器,需要对每个服务器尝试获取该用户的成员对象(因为机器人默认不会缓存所有服务器的成员,所以需要主动fetch)。你后续更新的代码已经解决了这个问题,这里优化一下逻辑更清晰:
const mutualGuilds = []; for (const [, guild] of interaction.client.guilds.cache) { try { // 尝试获取用户在该服务器的成员信息,成功则说明是共同服务器 await guild.members.fetch(interaction.user); mutualGuilds.push(guild); } catch (error) { // 捕获错误=用户不在该服务器,或机器人无GuildMembers权限 console.log(`跳过服务器 ${guild.name}: ${error.message}`); } }
⚠️ 注意:机器人需要目标服务器的GuildMembers权限才能执行guild.members.fetch(),否则会触发权限报错。
Q2 如何将共同服务器动态展示在机器人消息的选择菜单中?
你后续的代码已经实现了这个需求,这里再给出更简洁的写法:
// 把共同服务器转换成选择菜单要求的选项格式 const selectOptions = mutualGuilds.map(guild => ({ label: guild.name, // 菜单中显示的服务器名称 value: guild.id, // 选中后返回的服务器ID(后续交互会用到) description: `ID: ${guild.id}` // 可选的辅助描述 })); // 创建包含选择菜单的消息行 const row = new MessageActionRow() .addComponents( new MessageSelectMenu() .setCustomId('server-select') .setPlaceholder('请选择一个共同服务器') .addOptions(selectOptions) ); // 回复用户(如果已经调用过reply,就用editReply) await interaction.reply({ embeds: [{ description: '请选择要操作的共同服务器' }], components: [row] });
复盘你最初代码的其他问题
- 不要在命令执行函数里新建
Client实例,完全多余且会导致缓存未加载 - 你最初的
Promise.all代码没有用await等待异步操作完成,所以console.log输出的是未完成的Promise对象
内容的提问来源于stack exchange,提问作者MRDGH2821
相关产品推荐
相关产品推荐

