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

如何让Discord反应收集器(reaction collector)获取前2条用户反应?

问题根因

你在创建反应收集器的配置中设置了max: 1,该参数的作用是限制收集器最多仅收集1条符合过滤规则的反应,触发1次后就会自动触发end事件停止运行,这是无法触发第二次操作的核心原因。

修复方案

  • 移除收集器配置中的max: 1参数,可按需调整time参数设置收集器自动停止的时长,单位为毫秒,填0则不会自动超时。
  • 不再在end事件中处理用户操作逻辑,改为监听collect事件,该事件会在每次有符合过滤规则的反应被触发时执行,支持多次响应。
  • 建议在每次处理完用户反应后删除对应用户的反应记录,避免用户需要先取消反应才能再次触发的问题。

修正后参考代码

queue.textChannel.send(thing).then((question) => {
    question.react('⏸');
    question.react('▶️');
    question.react('⬅️');
    question.react('⏹️');

    const filter = (reaction, user) => {
        return ['⏹️', '⬅️','⏸','▶️'].includes(reaction.emoji.name) && !user.bot;
    };

    // 移除max限制,此处示例设置5分钟后自动停止收集,按需修改即可
    const collector = question.createReactionCollector(filter, {
        time: 300000
    }); 

    // 监听collect事件处理每次用户的反应操作
    collector.on('collect', (reaction, user) => {
        const emoji = reaction.emoji.name;
        // 此处填写你原有的各表情对应控制逻辑
        switch(emoji) {
            case '⏸':
                // 暂停音乐逻辑
                break;
            case '▶️':
                // 播放音乐逻辑
                break;
            case '⬅️':
                // 切上一首歌逻辑
                break;
            case '⏹️':
                // 停止播放逻辑
                // 如果需要点击停止后直接结束收集器,可以手动调用stop
                // collector.stop('user_stop');
                break;
        }
        // 处理完成后删除用户的反应,方便用户下次直接点击
        reaction.users.remove(user.id).catch(err => console.log(err));
    });

    collector.on('end', (collected, reason) => {
        if (reason === 'time') {
            msg.reply('控制已超时结束');
        }
    });
});

额外注意

如果你使用的是discord.js v13及以上版本,需要确保在客户端初始化时开启了GUILD_MESSAGE_REACTIONS网关意图,否则无法正常接收反应事件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:24:01