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

