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

如何在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] 
});

复盘你最初代码的其他问题

  1. 不要在命令执行函数里新建Client实例,完全多余且会导致缓存未加载
  2. 你最初的Promise.all代码没有用await等待异步操作完成,所以console.log输出的是未完成的Promise对象

内容的提问来源于stack exchange,提问作者MRDGH2821

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 19:39:05