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

Discord抽奖重roll命令报错,求特定消息ID的反应缓存方法

问题分析与解决方案

核心问题

你的代码存在三个关键错误,导致运行报错:

  • 异步操作未处理:messages.fetch() 返回 Promise 对象,必须等待其完成后才能访问消息的 reactions,直接链式调用会因 Promise 未解析而获取不到数据。
  • 变量未定义:winnerCount 未声明,代码中直接使用会引发未定义错误。
  • 链式调用逻辑错误:在 Promise 未完成时同步访问 .reactions.cache,会得到 undefined,进而导致后续方法调用失败。

修正后的代码

以下是可正常运行的重抽命令实现,包含错误处理和清晰的步骤逻辑:

client.on("messageCreate", async (message) => {
    if (message.content === "!reroll") {
        // 定义要抽取的中奖人数
        const winnerCount = 1;
        
        try {
            // 1. 获取指定频道中的目标抽奖消息
            const targetChannel = client.channels.cache.get("1046154195406946394");
            if (!targetChannel) {
                return message.channel.send("指定频道不存在!");
            }
            
            const targetMessage = await targetChannel.messages.fetch("1051062563045117952");
            
            // 2. 获取该消息上的🎉反应
            const reaction = targetMessage.reactions.cache.get("🎉");
            if (!reaction) {
                return message.channel.send("目标消息上未找到🎉反应!");
            }
            
            // 3. 过滤掉机器人用户,得到有效参与列表
            const validParticipants = reaction.users.cache.filter(user => !user.bot);
            if (validParticipants.size === 0) {
                return message.channel.send("没有有效参与抽奖的用户!");
            }
            
            // 4. 随机抽取指定数量的获奖者
            const winners = validParticipants.random(winnerCount);
            
            // 5. 格式化并发送结果
            const winnerDisplay = Array.isArray(winners) 
                ? winners.map(user => user.tag).join("、") 
                : winners.tag;
            
            message.channel.send(`🎉 重抽结果:恭喜 ${winnerDisplay} 中奖!`);
        } catch (error) {
            console.error("重抽命令出错:", error);
            message.channel.send("重抽失败,请检查消息ID或频道ID是否正确!");
        }
    }
});

针对特定 message.id 获取反应的说明

要获取指定消息的反应,需遵循以下步骤:

  1. 通过频道ID获取目标频道对象。
  2. 使用 messages.fetch(messageId) 异步获取目标消息(此方法会从Discord服务器拉取最新的消息数据,包含所有反应)。
  3. 通过 message.reactions.cache.get(emoji) 获取对应表情的反应对象,其中 emoji 可以是表情符号(如🎉)或表情ID。
  4. 从反应对象的 users.cache 中获取所有参与该反应的用户,再过滤掉机器人即可得到有效参与者列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 14:25:16