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

discord.js机器人重启后下拉菜单失效问题求助

故障根本原因

  • 你的clickMenu事件监听器注册逻辑写在了message事件的回调内部,属于临时注册的监听器:
    1. 每次有人触发prefix + rr命令,都会额外新增一个重复的监听器,运行时间久了会导致内存泄漏、响应卡顿
    2. 监听器的判断逻辑完全依赖临时变量menumsg,这个变量存在程序运行内存中,机器人重启后内存清空,之前发送的下拉菜单没有对应的监听逻辑,自然无法响应
  • 额外逻辑问题:你设置了仅发送rr命令的用户可以点击菜单,完全不符合角色分配菜单的通用需求;且两个下拉选项都设置了setDefault(),不符合单选菜单的规则,会导致组件渲染异常

修复方案

  1. 将菜单点击的事件监听逻辑移到全局,不要嵌套在message事件内部
  2. 给下拉菜单设置固定的自定义ID,通过ID匹配交互逻辑,避免依赖临时内存变量,重启后也能正常响应
  3. 修正权限判断、默认选项等逻辑错误

以下为适配discord.js v14原生交互的修正代码(你之前使用的是第三方组件包写法,替换为原生写法兼容性更强,适配新版Node.js运行环境):

// 全局监听交互事件,不要嵌套在消息事件内
client.on('interactionCreate', async interaction => {
  // 过滤非下拉菜单的交互
  if (!interaction.isStringSelectMenu()) return;
  // 匹配我们的VIP角色分配菜单ID
  if (interaction.customId !== 'vip_role_select') return;

  // 替换为你自己的VIP权限角色ID
  const vipRoleId = 'secret';
  if (!interaction.member.roles.cache.has(vipRoleId)) {
    return interaction.reply({ content: ':x: 你没有权限领取该类角色', ephemeral: true });
  }

  // 选项值和角色ID的映射,替换为你自己的角色ID
  const roleMap = {
    'option_1': 'secret',
    'option_2': 'secret'
  };

  const selectedValue = interaction.values[0];
  const targetRole = interaction.guild.roles.cache.get(roleMap[selectedValue]);
  const otherRole = interaction.guild.roles.cache.get(roleMap[Object.keys(roleMap).find(k => k !== selectedValue)]);

  await interaction.member.roles.add(targetRole);
  await interaction.member.roles.remove(otherRole);

  await interaction.reply({ content: `成功领取${targetRole.name}角色!`, ephemeral: true });
});

// 发送菜单的消息监听逻辑
client.on('messageCreate', async message => {
  if (message.content !== prefix + 'rr') return;
  // 权限判断:仅管理员可以触发发送菜单,可按需修改
  if (!message.member.permissions.has('Administrator')) return;

  // 构造下拉菜单组件
  const row = new Discord.ActionRowBuilder()
    .addComponents(
      new Discord.StringSelectMenuBuilder()
        .setCustomId('vip_role_select')
        .setPlaceholder('选择你要的角色')
        .setMinValues(0)
        .setMaxValues(1)
        .addOptions(
          {
            label: 'Black Charcoal',
            value: 'option_1',
            emoji: '🌑'
          },
          {
            label: 'Love Magenta',
            value: 'option_2',
            emoji: '❤️'
          }
        )
    );

  // 构造展示用的嵌入消息
  const embed = new Discord.EmbedBuilder()
    .setColor('0x00a6ff')
    .setTitle('VIP 彩色角色')
    .setDescription(`<@&secret>
<@&secret>
<@&secret>
<@&secret>
<@&secret>`);

  await message.channel.send({ embeds: [embed], components: [row] });
});

修改完成后重启机器人,删除之前发送的旧菜单,重新触发rr命令发送新菜单即可,后续机器人重启不会再影响菜单的正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:57:04