Discord JS中reaction.emoji返回undefined问题求助
解决Discord.js中
messageReactionAdd事件里reaction.emoji返回undefined的问题 我之前也碰到过一模一样的坑!大概率是因为你处理的是Partial(部分)对象,Discord.js 在特定场景下不会返回完整的 Reaction 对象,直接访问emoji属性自然会拿到undefined。
问题根源
当你的机器人启动后,对于那些机器人上线前就存在的消息,如果有人给这些消息添加反应,Discord 只会发送一个「精简版」的 Reaction 对象(也就是 Partial 对象)——这个对象只包含最基础的标识信息,像emoji这类详细属性并没有被加载,所以直接访问就会得到undefined。
解决方案
分两步就能搞定:
创建 Client 时启用 Partial 支持
首先初始化机器人客户端时,必须声明要支持的 Partial 类型,不然机器人根本不会处理 Partial 对象的事件:const Discord = require('discord.js'); const client = new Discord.Client({ partials: ['MESSAGE', 'CHANNEL', 'REACTION', 'USER'] // 必须包含这几个类型 });在事件处理中检查并获取完整的 Reaction 对象
在messageReactionAdd事件里,先判断当前 Reaction 是否是 Partial 对象,如果是,就调用fetch()方法拉取完整数据:client.on('messageReactionAdd', async (reaction, user) => { // 先处理 Partial 对象 if (reaction.partial) { try { await reaction.fetch(); // 获取完整的 Reaction 数据 } catch (err) { console.error('无法获取完整的 Reaction 对象:', err); return; // 获取失败就直接退出,避免后续报错 } } // 现在就能正常访问 emoji 属性了 console.log(reaction.emoji); // 如果是自定义表情,还能访问它的 id、name 等属性,比如 reaction.emoji.id、reaction.emoji.name });
这样处理后,不管是新消息的反应还是旧消息的反应,你都能正确拿到emoji对象了。
内容的提问来源于stack exchange,提问作者Vanerac
相关产品推荐
相关产品推荐

