discord.js中awaitReactions监听DM消息表情反应不生效问题
问题修复方案
- 缺少收集终止条件:当前仅配置了
time参数,awaitReactions默认会等待整个计时周期结束才触发then回调,不会在收到符合条件的反应时立即执行。需要在配置项中添加max: 1,指定收集到1个符合条件的反应就立即终止流程触发回调。 - 未过滤bot自身反应:你代码中自动给消息添加的👍会被计入收集范围,需要在过滤器中添加用户ID校验,仅响应接收DM的目标用户的操作。
- 版本适配/权限问题:
- 若使用discord.js v13及以上版本,
awaitReactions的传参结构发生了变化,过滤器需要作为配置项的filter属性传入,而非单独的第一个参数;同时初始化Client实例时需要在intents中开启DIRECT_MESSAGE_REACTIONS,否则私信场景的反应事件无法被捕获。 - 若使用v12及更早版本,保持过滤器单独传参即可,同时确认开启了对应私信反应权限。
- 若使用discord.js v13及以上版本,
修复后代码示例
discord.js v13+ 版本
member.send(currentEmbed).then(async (message) => { // 原有添加表情的循环逻辑不变 for(var j = 0; j < dividers.length; j++) { var number = ""; switch(dividers[j]) { case 1: number = "👍"; break; case 2: number = "2️⃣"; break; case 3: number = "3️⃣"; break; case 4: number = "4️⃣"; break; default: number = ""; break; } if(number) await message.react(number); } // 修改后的反应收集逻辑 message.awaitReactions({ filter: (reaction, user) => reaction.emoji.name === "👍" && user.id === member.id, max: 1, time: 150000 }).then(collected => { console.log("TEST"); }); });
discord.js v12及更早版本
member.send(currentEmbed).then(async (message) => { // 原有添加表情的循环逻辑不变 for(var j = 0; j < dividers.length; j++) { var number = ""; switch(dividers[j]) { case 1: number = "👍"; break; case 2: number = "2️⃣"; break; case 3: number = "3️⃣"; break; case 4: number = "4️⃣"; break; default: number = ""; break; } if(number) await message.react(number); } // 修改后的反应收集逻辑 const filter = (reaction, user) => reaction.emoji.name === "👍" && user.id === member.id; message.awaitReactions(filter, {max: 1, time: 150000}).then(collected => { console.log("TEST"); }); });
内容的提问来源于stack exchange,提问作者Kuno Claes
相关产品推荐
相关产品推荐

