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

Discord.js Reaction Collector触发后switch语句不执行问题咨询

问题根因

  • collect 事件回调参数顺序错误:Discord.js v12及以上版本中,collect 事件传递的参数顺序为 (reaction, user),你代码中写的 (message, reaction, user) 会导致变量值完全错位,你代码里的reaction变量实际存储的是触发反应的用户对象,无法获取到正确的emoji值,所以switch分支全部匹配失败。
  • emoji匹配取值错误:直接使用reaction.emoji得到的是Emoji实例对象,和字符串比对永远返回false,需要取reaction.emoji.name才能拿到表情的文本标识用于匹配。
  • 过滤器逻辑可优化:无需用find遍历全部成员查找用户,直接用get方法按id取值性能更高,同时可以添加可选链避免找不到成员时报错。

补充注意事项

如果使用Discord.js v13及更高版本,需要确认你初始化Client时的intents配置中已经包含GUILD_MESSAGE_REACTIONS,否则反应事件不会被上报触发。

修正后代码

console.log(`User Report Created (reportCreated = true)`);

try {
    await newUserEmbed.react("🔨");
    await newUserEmbed.react("❌");
    await newUserEmbed.react("❓");
} catch (err) {
  message.channel.send('`ERROR: Reactions Error`');
  throw err;
};

const collector = newUserEmbed.createReactionCollector(
  (reaction, user) => message.guild.members.cache.get(user.id)?.permissions.has("MANAGE_CHANNELS"),
  { dispose: true }
);

collector.on('collect', (reaction, user) => {
    console.log('Collecting Reactions for User Report (collectorRun = true)');
    switch (reaction.emoji.name){
        case "🔨":
          newUserEmbed.delete();
          message.reply(`This report for ${args[1]} has been marked as completed.`);
          break;
        case "❌":
          newUserEmbed.delete();
          message.reply(`This report for ${args[1]} has been declined.`);
          break;
        case "❓":
          newUserEmbed.delete();
          message.reply(`This report for ${args[1]} has been marked as inconclusive.`);
          break;
    }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 20:15:03