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
相关产品推荐
相关产品推荐

