Discord机器人开发遇Cannot read property 'id' of undefined报错 如何实现撤反应移除角色
你遇到的报错如下:
Cannot read property 'id' of undefined
报错原因&修复点
- 1 反应收集器的配置参数传参错误:
createReactionCollector仅接受2个参数,你将dispose配置拆分到了第三个独立对象,导致配置未生效,无法正确触发反应移除事件 - 2 反应移除的事件监听写法错误:你错误调用了
collector.dispose()方法,正确的监听反应移除事件应该用collector.on('remove', 回调函数),你之前的错误写法导致回调接收的user参数为undefined,调用user.id就会触发对应报错 - 3 额外优化点:
- 过滤函数排除机器人自身触发的反应,避免不必要的逻辑执行
- 成员获取优先用
fetch拉取而不是直接读缓存,避免缓存中不存在对应成员时报错
修正后完整代码
const msg = message.channel.send(gvg).then(async msg => { await msg.react('🟢'); await msg.react('🟠'); await msg.react('🔴'); await msg.react('⚙️'); // 过滤逻辑新增排除机器人 const filter = (reaction, user) => !user.bot && ['🟢', '🟠', '🔴', '⚙️'].includes(reaction.emoji.name); // 所有配置合并到第二个参数,开启dispose const collector = msg.createReactionCollector(filter, { time: 30000, dispose: true }); collector.on('collect', async (reaction, user) => { // 用fetch拉取成员,避免缓存缺失 const member = await message.guild.members.fetch(user.id); if (reaction.emoji.name === '🟢' ) { member.roles.add('845380394513596446'); } if (reaction.emoji.name === '🟠') { member.roles.add('845380453597708299') } if (reaction.emoji.name === '🔴') { member.roles.add('845380484964024330') } if (reaction.emoji.name === '⚙️') { member.roles.remove('845380484964024330') member.roles.remove('845380453597708299') member.roles.remove('845380394513596446') } }); // 正确监听remove事件处理撤回反应的逻辑 collector.on('remove', async (reaction, user) => { const member = await message.guild.members.fetch(user.id); if (reaction.emoji.name === '🟢' ) { member.roles.remove('845380394513596446'); } if (reaction.emoji.name === '🟠') { member.roles.remove('845380453597708299') } if (reaction.emoji.name === '🔴') { member.roles.remove('845380484964024330') } }); })
内容的提问来源于stack exchange,提问作者Dusk Sys
相关产品推荐
相关产品推荐

