discord.js自定义emoji反应角色增删失效问题解决方法
故障原因
自定义emoji的判断逻辑存在取值错误:
- 普通Unicode emoji没有专属ID,
reaction.emoji.id值为null,可以直接通过reaction.emoji.name匹配emoji字符本身,所以✅对应的判断分支能正常运行 - 自定义服务器emoji的
reaction.emoji.id存储的是纯数字格式的emoji ID,原代码里用来比对的是完整emoji字符串<:female:996009905720918076>,和实际存储的纯数字ID永远无法相等,所以对应分支始终不触发。
修复方案
- 提取自定义emoji的纯数字ID:从完整emoji串里取出最后一段数字
996009905720918076,作为判断的比对值 - 建议将两个独立的
if判断改为if...else if结构,减少无意义的重复判断 - 可选优化:用
guild.members.fetch()替代直接读缓存拿成员,避免成员未加载到缓存时触发报错
修复后代码
if (reaction.emoji.name === "✅") { const member = await reaction.message.guild.members.fetch(user.id); await member.roles.add("996019880765702154"); await reaction.users.remove(user.id); } else if (reaction.emoji.id === "996009905720918076") { const member = await reaction.message.guild.members.fetch(user.id); await member.roles.add("996020079420510208"); await reaction.users.remove(user.id); }
补充说明:如果是动态自定义emoji(格式为<a:表情名:数字ID>),判断逻辑完全一致,只需要比对reaction.emoji.id对应的纯数字ID即可,不需要拼接前缀格式串。
内容的提问来源于stack exchange,提问作者AlainaSanchez
相关产品推荐
相关产品推荐

