Node.js+Discord.js中messageReactionAdd监听为何仅触发机器人反应不触发用户反应
问题原因排查
- 缺少对应网关意图(Intents)
Discord.js v13及以上版本要求显式声明网关意图才能接收对应事件,messageReactionAdd事件需要在初始化Client时开启对应权限:服务器内的消息反应需要开启GuildMessageReactions意图,私信场景的反应需要开启DirectMessageReactions意图。
示例初始化配置参考:
const { Client, GatewayIntentBits, Partials } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.GuildMessageReactions, // 服务器反应必填 // GatewayIntentBits.DirectMessageReactions 私信反应需额外添加 ], partials: [Partials.Message, Partials.Channel, Partials.Reaction, Partials.User] });
- 未配置Partials导致非缓存事件不触发
Discord.js默认仅抛出本地缓存中完整加载对象对应的事件,如果你需要接收缓存外的消息/反应事件(比如用户对机器人刚发送、还未完全同步到缓存的消息添加反应),必须在初始化Client时声明对应Partials,上述示例代码已包含必要的Partials配置。 - 机器人缺少服务器权限
如果是在服务器频道内使用,机器人所在的角色需要拥有读取消息历史权限,否则无法接收该频道内的用户反应事件。 - 额外代码优化提示
你当前将client.on("messageReactionAdd")写在channel.send的回调中,会导致每发送一条消息就重复注册一次相同的事件监听器,长期运行会出现内存泄漏、同一次反应触发多次逻辑的问题,建议把事件监听器移到全局仅注册一次,在回调中判断触发反应的消息ID是否为目标监听消息即可。
内容的提问来源于stack exchange,提问作者vol1n
相关产品推荐
相关产品推荐

