Discord.js 无法获取 reaction 所属用户?实现反应触发带用户名消息的问题
问题根因
你当前代码取的reaction.message.author是被添加 reaction 的原始消息的作者,不是触发本次 reaction 操作的用户,所以才会一直输出原消息(也就是你bot自己发的消息)的作者名。
解决方案
1. 利用事件自带的用户参数
discord.js 的messageReactionAdd(reaction 新增事件)回调函数默认会传入两个参数:
reaction:反应对象,也就是你当前代码里用到的变量user:实际做出 reaction 操作的用户,你之前完全没用到这个参数,才会取错对象。
直接接住这个user参数,取它的用户名即可,改后的基础代码如下:
// 回调必须把第二个user参数加上,否则无法拿到触发者信息 client.on('messageReactionAdd', async (reaction, user) => { if (reaction.emoji.name === firstEmoji) { await reaction.message.channel.send(`${user.username} reacted!`); } });
2. 兼容未缓存场景
如果遇到 reaction 对应的消息没被本地缓存,导致拿不到完整数据的情况,可以加上 partial 缓存拉取逻辑,避免报错:
client.on('messageReactionAdd', async (reaction, user) => { // 未缓存的反应/用户对象先拉取完整数据 if (reaction.partial) await reaction.fetch(); if (user.partial) await user.fetch(); // 可选:排除bot自身的反应,避免重复触发 if (user.bot) return; if (reaction.emoji.name === firstEmoji) { await reaction.message.channel.send(`${user.username} reacted!`); } });
3. 可选优化
如果需要展示用户在服务器里的昵称(而非全局用户名),可以改用以下写法:
// 取用户在当前服务器的展示昵称,没有设置昵称则回退到全局用户名 const displayName = reaction.message.guild?.members.cache.get(user.id)?.displayName || user.username; await reaction.message.channel.send(`${displayName} reacted!`);
注意:如果无法正常触发事件或者拿不到user参数,请检查初始化bot时是否开启了对应网关意图,比如服务器内reaction需要开启
GatewayIntentBits.GuildMessageReactions。
内容的提问来源于stack exchange,提问作者Newbie...
相关产品推荐
相关产品推荐

