discord.js报Cannot read property 'name' of undefined 读取reactions.json匹配角色失败
问题根因
你触发Cannot read property 'name' of undefined的直接原因是messageReactionAdd事件回调的参数解构错误:
discord.js的messageReactionAdd事件触发时,第一个入参是MessageReaction对象,其内置的表情属性叫emoji,不是emojis,你代码里解构写了emojis,导致这个变量本身是undefined,访问emojis.name自然触发报错。
其他存在的问题
- 读取
reactions.json的逻辑完全不匹配结构:你存的emoji和角色的映射是vote.xxx = 表情,roles.xxx = 角色名,你直接写reactionsJSON[emojis.name]根本拿不到任何值,层级完全错误。 - 重复声明了
guild变量,同作用域下两次const { guild } = message会触发语法错误。 reactions.json最后多了冗余逗号,部分Node.js版本下解析JSON会报错。- 没有判断是否是你指定的消息频道触发的反应,任意频道加反应都会触发逻辑,不符合预期。
修正后的代码
首先修正reactions.json,去掉最后多余的逗号:
{ "channel": "test", "channelID": "", "roles": { "melee": "🪓 Melee DPS", "ranged": "🏹 Ranged DPS", "caster": "🧙🏻 Caster DPS", "healer": "🚑 Healer", "tank": "🔰 Tank" }, "vote": { "melee": "🪓", "ranged": "🏹", "caster": "🧙🏻", "healer": "🚑", "beginner": "🔰" } }
再修正JS代码:
const fs = require('fs'); // JSON读取放在事件外,避免每次触发都重复读文件 const reactionsJSON = JSON.parse(fs.readFileSync('reactions.json', 'utf8')); client.on('messageReactionAdd', addRole); async function addRole({ message, emoji }, user) { // 过滤机器人操作 if (user.bot) return; if (message.partial) { try { await message.fetch(); } catch (err) { console.error('Error fetching message', err); return; } } // 只匹配配置的频道,不需要可删除这段 if (message.channel.id !== reactionsJSON.channelID && message.channel.name !== reactionsJSON.channel) { return; } const { guild } = message; const member = guild.members.cache.get(user.id); if (!member) return; // 匹配当前表情对应的角色key const roleKey = Object.keys(reactionsJSON.vote).find(key => reactionsJSON.vote[key] === emoji.name); if (!roleKey) return; // 拿key查找对应角色 const role = guild.roles.cache.find(role => role.name === reactionsJSON.roles[roleKey]); if (!role) { console.error(`Role not found for '${reactionsJSON.roles[roleKey]}'`); return; } try { await member.roles.add(role.id); } catch (err) { console.error('Error adding role', err); return; } }
内容的提问来源于stack exchange,提问作者f00d
相关产品推荐
相关产品推荐

