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

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...

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 15:06:01