Discord.js消息反应添加角色报错:TypeError读取getMember未定义
解决Discord.js消息反应添加角色的报错问题
错误根源
你代码里的reaction.options是不存在的属性,这就是触发TypeError: Cannot read properties of undefined (reading 'getMember')的原因。Discord.js的MessageReaction对象没有options这个属性,自然没法调用它下面的getMember和getRole方法。
修正后的完整代码
const { Client, GatewayIntentBits, Partials } = require('discord.js'); const { token } = require('./config.json'); const client = new Client({ intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.GuildMessageReactions], partials: [Partials.Message, Partials.Channel, Partials.Reaction], }); client.once('ready', () => { console.log("Готов!"); }); client.on('messageReactionAdd', async (reaction, user) => { // 跳过机器人自己的反应,避免死循环 if (user.bot) return; // 检查是否是目标频道 if (reaction.message.channel.id !== '1030100801747701760') return; // 检查是否是目标表情 if (reaction.emoji.name !== '😄') return; try { // 获取当前服务器对象 const guild = reaction.message.guild; // 把全局用户对象转换成服务器成员对象(只有成员才能操作角色) const member = await guild.members.fetch(user.id); // 从服务器缓存里获取目标角色 const role = guild.roles.cache.get('1030138804830478387'); // 确认成员和角色都存在的话,添加角色 if (member && role) { await member.roles.add(role); console.log(`已给用户 ${user.tag} 加上角色 ${role.name}`); } else { console.log('找不到目标成员或角色'); } } catch (error) { console.error('添加角色时出错:', error); } }); // 别忘了登录机器人 client.login(token);
关键修正说明
- 替换错误的角色/成员获取方式:用
reaction.message.guild拿到服务器对象,再通过guild.members.fetch()获取成员(全局用户对象没法直接操作角色),用guild.roles.cache.get()获取目标角色。 - 增加错误捕获:用
try/catch包裹角色操作逻辑,方便排查运行时的权限或不存在问题。 - 跳过机器人反应:避免机器人对自己的消息反应触发逻辑,导致无效操作。
- 异步操作处理:
members.fetch()和roles.add()都是异步方法,必须用await等待执行完成。
额外注意事项
- 确保机器人拥有管理角色的权限,并且机器人自身的角色位置要高于你要添加的目标角色,否则会有权限不足的报错。
- 确认
config.json里的token是正确的Discord机器人令牌。 - 你原本配置的网关意图和Partials是正确的,不需要修改。
内容的提问来源于stack exchange,提问作者MooNWaY
相关产品推荐
相关产品推荐

