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

Discord.js raw事件处理获取guild后无响应 无法给反应用户加角色

修复方案

错误原因

  • discord.js v12及以上版本中,guilds、members等集合类资源的获取方法已全部迁移到cache属性下,你使用的client.guilds.get()是v11的废弃写法,运行时会直接抛出方法未定义错误,导致代码终止执行。
  • guildID变量未使用let/const声明,严格运行模式下会抛出引用错误。
  • 直接从members.cache中取用户可能遇到成员未缓存的情况,取值为undefined时调用方法会报错,且你外层的try/catch只能捕获同步错误,无法捕获roles.add这类异步方法抛出的错误。
  • 你变量名guildID语义错误,实际存储的是服务器对象而非ID,容易引发逻辑混淆。

修复后代码

client.on('raw', async packet => {
    if (!['MESSAGE_REACTION_ADD', 'MESSAGE_REACTION_REMOVE'].includes(packet.t)) return;
    if (packet.d.channel_id !== '<CHANNEL_ID>') return;

    // 修复获取guild的写法,修正变量语义
    const guild = client.guilds.cache.get(packet.d.guild_id);
    if (!guild) return;

    if (packet.t === 'MESSAGE_REACTION_ADD') {
        console.log("ADDED");
        if (packet.d.emoji.name === '⭐') {
            try {
                // 优先取缓存成员,缓存不存在则主动拉取
                const member = guild.members.cache.get(packet.d.user_id) || await guild.members.fetch(packet.d.user_id);
                await member.roles.add('<ROLE_ID>');
            } catch (error) {
                console.log('添加角色失败:', error);
            }
        }
    }
    if (packet.t === 'MESSAGE_REACTION_REMOVE') {
        console.log("REMOVED");
        // 移除角色逻辑可参考上方添加逻辑实现
    }
});

注意事项

  • 请提前在Discord开发者平台的机器人设置页面开启SERVER MEMBERS INTENT权限,否则无法拉取服务器成员信息。
  • 请将代码中的<CHANNEL_ID>、<ROLE_ID>替换为你实际使用的频道ID和角色ID。
  • 请确认机器人拥有分配对应角色的权限,且目标角色的等级低于机器人自身的角色等级。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 14:36:05