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

JS版Discord Bot无法读取表情反应及collected.array报错问题

问题描述

开发Discord游戏引导机器人时,需要实现表情反应菜单功能:用户对机器人消息发送👍表情时,机器人回复Test1。最初触发反应后机器人无响应,调整代码后又抛出TypeError: collected.array is not a function错误。

相关代码:

case 'Testembed': //带表情反应的测试嵌入消息
    message.channel.send({embeds: [Testembed.de.data]}).then((question) => {
        question.react('🙃')
        question.react('👍')
      
        const filter = (reaction, user) => {
            return ['👍','🙃'].includes(reaction.emoji.name) && !user.bot;
        };
        const collector = question.createReactionCollector(filter, { //此处开始出问题
            max: 1,
            time: 15000
        });

        collector.on('end', (collected, reason) => {
            if (reason === 'time') {
                message.channel.send('时间到了...');
            } else {
                let userReaction = collected.array()[0];
                let emoji = userReaction._emoji.name;

                if (emoji === '👍'){
                    message.channel.send('Test1');
                } else if (emoji === '🙃') {
                    message.channel.send('Test2');
                } else {
                    message.channel.send("I don't understand ${emoji}...");
                }
            }
        });
    });
    break;

报错信息:

throw er; // Unhandled 'error' event
      ^

TypeError: collected.array is not a function

解决方法

1. 修复collected.array()的错误

在Discord.js v13及以上版本中,ReactionCollector结束时返回的collected是Collection对象,不再提供array()方法。要获取第一个收集到的反应,直接使用collected.first()即可,这是Collection对象内置的方法,比手动转数组更高效。

2. 修复模板字符串语法错误

最后else分支里的消息用双引号包裹,无法解析${emoji}变量,会直接显示成字面量。需要把双引号改成反引号,才能正确解析模板字符串。

3. (可选)优化响应及时性

如果希望用户触发反应后立即响应,而不是等收集器结束(当前配置max:1,收集到一个就结束),可以额外监听collect事件,响应更及时:

collector.on('collect', (reaction, user) => {
    const emoji = reaction.emoji.name;
    if (emoji === '👍'){
        message.channel.send('Test1');
    } else if (emoji === '🙃') {
        message.channel.send('Test2');
    }
});

修改后的完整代码

case 'Testembed': //带表情反应的测试嵌入消息
    message.channel.send({embeds: [Testembed.de.data]}).then((question) => {
        question.react('🙃')
        question.react('👍')
      
        const filter = (reaction, user) => {
            return ['👍','🙃'].includes(reaction.emoji.name) && !user.bot;
        };
        const collector = question.createReactionCollector(filter, {
            max: 1,
            time: 15000
        });

        collector.on('end', (collected, reason) => {
            if (reason === 'time') {
                message.channel.send('时间到了...');
            } else {
                let userReaction = collected.first();
                if (!userReaction) return; // 防御性判断,避免无收集结果时出错
                let emoji = userReaction._emoji.name;

                if (emoji === '👍'){
                    message.channel.send('Test1');
                } else if (emoji === '🙃') {
                    message.channel.send('Test2');
                } else {
                    message.channel.send(`I don't understand ${emoji}...`);
                }
            }
        });
    });
    break;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:55:24