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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 12:45:02