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

Discord.js v14实现消息反应角色分配时无法获取原生Emoji的问题

Discord机器人原生表情无法通过client.emojis.cache获取的解决方案

问题核心

你当前的GET_EMOJI函数依赖client.emojis.cache,但这个缓存仅存储服务器自定义表情,Discord原生Unicode表情(比如🌌、🔫)并不在这个集合里,所以会返回undefined。

解决方案

1. 调整表情获取逻辑

修改GET_EMOJI函数,优先查找自定义表情,找不到则直接返回传入的表情标识(原生表情的短代码或Unicode字符,Discord会自动解析):

const GET_EMOJI = (name) => {
  // 先查找服务器自定义表情
  const customEmoji = client.emojis.cache.find(e => e.name === name);
  // 找不到则返回原名称(支持短代码如":milky_way:"或直接Unicode字符)
  return customEmoji || name;
};

2. 修正EMOJIS配置

原生表情可以直接使用Unicode字符或者Discord短代码(带冒号的格式),示例:

const EMOJIS = {
  // 自定义表情(用名称匹配缓存)
  valorant: "0valo",
  // 原生表情:直接用Unicode字符
  test_1: "🌌",
  // 原生表情:用Discord短代码
  test_2: ":gun:",
  test_3: ":milky_way:"
};

3. 完整修改后的roleClaimed.js示例

const FIRST_MSG = require("./firstMsg");

const ROLE_CHANEL_NAME = "roles";

const EMOJIS = {
  // 自定义表情
  valorant: "0valo",
  // 原生表情配置
  test_1: "🌌",
  test_2: ":gun:",
  test_3: ":milky_way:"
};

module.exports = (client) => {
  const CHANNEL = client.channels.cache.find(e => e.name === ROLE_CHANEL_NAME);
  // 调整后的表情获取函数
  const GET_EMOJI = (name) => {
    const customEmoji = client.emojis.cache.find(e => e.name === name);
    return customEmoji || name;
  };
  const CHOICE = [];
  let txt = "test msg\n\n";

  for (const KEY in EMOJIS) {
    const ROLE = KEY;
    const EMOJI = GET_EMOJI(EMOJIS[KEY]);

    CHOICE.push(EMOJI);
    txt += `${EMOJI} : ${ROLE}\n`;
  }
  FIRST_MSG(CHANNEL, txt, CHOICE);
};

注意事项

  • 给消息添加反应时,Discord.js支持直接传入Unicode字符或短代码(带冒号),无需额外处理。
  • 优先使用Unicode字符可以避免短代码解析可能出现的兼容性问题。

内容的提问来源于stack exchange,提问作者SolidCat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 07:03:17