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
相关产品推荐
相关产品推荐

