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

Discord.JS开发求助:反应角色面板在机器人重启后停止工作

问题修复方案

根因说明

  • 代码存在语法逻辑错误,if (user.bot)判断后无对应执行逻辑,导致后续校验逻辑触发条件错误
  • 未开启discord.js的Partial(部分结构)配置,机器人重启后不会缓存重启前已发送的反应角色菜单消息,对应消息的反应事件无法被触发
  • 直接从缓存拉取服务器成员,若成员未被缓存会返回undefined,导致角色添加逻辑报错
  • 未配置对应网关意图,反应事件无法正常上报

修复步骤

1. 初始化Client时开启对应配置

在你实例化机器人客户端的位置,添加网关意图和部分结构配置,示例代码:

const { Client, GatewayIntentBits, Partials } = require('discord.js');
const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.GuildMessageReactions,
    GatewayIntentBits.GuildMembers
  ],
  partials: [
    Partials.Message,
    Partials.Reaction,
    Partials.User,
    Partials.GuildMember
  ]
});

2. 修正反应监听逻辑

修复原有代码的逻辑问题,添加成员拉取、错误捕获逻辑:

client.on('messageReactionAdd', async (reaction, user) => {
  // 处理部分结构数据
  if (reaction.message.partial) await reaction.message.fetch();
  if (reaction.partial) await reaction.fetch();
  // 过滤机器人触发的反应
  if (user.bot) return;
  // 过滤非服务器内的反应
  if(!reaction.message.guild) return;

  if (reaction.message.channel.id === channel) {
    // 拉取成员,避免缓存不存在的问题
    const member = await reaction.message.guild.members.fetch(user.id).catch(() => null);
    if (!member) return;
    if (reaction.emoji.name === reactone){
      await member.roles.add(roleone).catch(console.error);
    }
    if (reaction.emoji.name === reacttwo){
      await member.roles.add(roletwo).catch(console.error);
    }
    if (reaction.emoji.name === reactthree){
      await member.roles.add(rolethree).catch(console.error);
    }
    if (reaction.emoji.name === reactfour){
      await member.roles.add(rolefour).catch(console.error);
    }
    // 可继续添加更多规则
  }
});

// 若需要实现取消反应收回身份组的功能,额外添加如下监听事件
client.on('messageReactionRemove', async (reaction, user) => {
  if (reaction.message.partial) await reaction.message.fetch();
  if (reaction.partial) await reaction.fetch();
  if (user.bot) return;
  if(!reaction.message.guild) return;

  if (reaction.message.channel.id === channel) {
    const member = await reaction.message.guild.members.fetch(user.id).catch(() => null);
    if (!member) return;
    if (reaction.emoji.name === reactone){
      await member.roles.remove(roleone).catch(console.error);
    }
    if (reaction.emoji.name === reacttwo){
      await member.roles.remove(roletwo).catch(console.error);
    }
    if (reaction.emoji.name === reactthree){
      await member.roles.remove(rolethree).catch(console.error);
    }
    if (reaction.emoji.name === reactfour){
      await member.roles.remove(rolefour).catch(console.error);
    }
    // 可继续添加更多规则
  }
});

额外注意事项

  • 确保机器人的角色在服务器角色列表中的排序高于所有需要分配/收回的身份组,且拥有管理角色权限
  • 所有身份组、频道、表情变量建议使用ID值进行匹配,避免名称修改后逻辑失效
  • 所有异步操作添加catch捕获错误,可以在控制台查看权限、不存在等报错信息,方便定位问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:18:02