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

Discord.js v12中!vote命令无法添加消息反应的问题求助

问题分析与修复方案

你的!vote命令失效的核心原因是Discord.js v12的API变更,再加上代码里的几个细节问题,导致添加反应的逻辑根本没执行。让我一步步拆解并给出修复方案:

核心问题:废弃API调用

Discord.js v12中,channel.fetchMessages()方法已被完全移除,取而代之的是channel.messages.fetch()。你原代码调用了不存在的方法,导致Promise链抛出错误,但因为没有错误捕获,后续的反应逻辑直接被跳过;而确认消息因为在Promise链之外,所以正常发送——这就是为什么你只看到反馈却没有反应的原因。

其他次要问题

  1. message.delete({ timeout: 1 })的timeout单位是毫秒,1毫秒几乎瞬间执行,可能导致删除操作还未完成就开始拉取消息,引发逻辑混乱。
  2. 对象比较方式错误:直接用!=比较GuildMember对象(lastMessage.member != message.member)是引用比较,不可靠,应该用GuildMember的equals()方法。
  3. 代码嵌套过深,且在execute函数内部才引入Discord.js,不符合最佳实践。
  4. switch语句使用字符串参数,不如用已经parseInt后的数字更严谨。

修复后的完整代码

const Discord = require('discord.js'); // 移到文件顶部,符合最佳实践

module.exports = { 
  name: 'vote', 
  description: 'Szavazás létrehozva', 
  guildOnly: true, 
  dmOnly: false, 
  adminOnly: false, 
  async execute(message, args) { // 改用async/await简化异步逻辑
    console.log(`Vote - Start with argument ${args[0]}`);
    const channel = message.channel;

    if (!args[0]) {
      return message.channel.send("Adj meg egy paramétert!");
    }

    console.log("Vote - Else");
    const parameter = parseInt(args[0], 10);

    if (parameter > 10 || parameter < 0) {
      return message.channel.send("Adj meg egy 0 és 10 közötti számot!");
    }

    console.log("Vote - Before Delete");
    try {
      // 等待命令消息删除完成,设置合理超时
      await message.delete({ timeout: 1000 });
      
      // 使用Discord.js v12的正确API拉取最新消息
      const messages = await channel.messages.fetch({ limit: 1 });
      console.log("Vote - Before let lastMessage");
      const lastMessage = messages.first();

      // 用equals方法准确比较成员,同时兼容无member的系统消息
      if (lastMessage.member && !lastMessage.member.equals(message.member) && !message.member.roles.cache.some(r=>r.name==="botadmin")) {
        return message.channel.send("Nem tőled származik az előző üzenet.");
      }

      console.log("Vote - Before Switch");
      // 用数字类型的parameter做判断,逻辑更严谨
      switch (parameter) {
        case 0:
          await lastMessage.react("✅");
          await lastMessage.react("❎");
          break;
        case 10:
          await lastMessage.react('1️⃣');
          await lastMessage.react('2️⃣');
          await lastMessage.react('3️⃣');
          await lastMessage.react('4️⃣');
          await lastMessage.react('5️⃣');
          await lastMessage.react('6️⃣');
          await lastMessage.react('7️⃣');
          await lastMessage.react('8️⃣');
          await lastMessage.react('9️⃣');
          await lastMessage.react('🔟');
          break;
        case 9:
          await lastMessage.react('1️⃣');
          await lastMessage.react('2️⃣');
          await lastMessage.react('3️⃣');
          await lastMessage.react('4️⃣');
          await lastMessage.react('5️⃣');
          await lastMessage.react('6️⃣');
          await lastMessage.react('7️⃣');
          await lastMessage.react('8️⃣');
          await lastMessage.react('9️⃣');
          break;
        case 8:
          await lastMessage.react('1️⃣');
          await lastMessage.react('2️⃣');
          await lastMessage.react('3️⃣');
          await lastMessage.react('4️⃣');
          await lastMessage.react('5️⃣');
          await lastMessage.react('6️⃣');
          await lastMessage.react('7️⃣');
          await lastMessage.react('8️⃣');
          break;
        case 7:
          await lastMessage.react('1️⃣');
          await lastMessage.react('2️⃣');
          await lastMessage.react('3️⃣');
          await lastMessage.react('4️⃣');
          await lastMessage.react('5️⃣');
          await lastMessage.react('6️⃣');
          await lastMessage.react('7️⃣');
          break;
        case 6:
          await lastMessage.react('1️⃣');
          await lastMessage.react('2️⃣');
          await lastMessage.react('3️⃣');
          await lastMessage.react('4️⃣');
          await lastMessage.react('5️⃣');
          await lastMessage.react('6️⃣');
          break;
        case 5:
          await lastMessage.react('1️⃣');
          await lastMessage.react('2️⃣');
          await lastMessage.react('3️⃣');
          await lastMessage.react('4️⃣');
          await lastMessage.react('5️⃣');
          break;
        case 4:
          await lastMessage.react('1️⃣');
          await lastMessage.react('2️⃣');
          await lastMessage.react('3️⃣');
          await lastMessage.react('4️⃣');
          break;
        case 3:
          await lastMessage.react('1️⃣');
          await lastMessage.react('2️⃣');
          await lastMessage.react('3️⃣');
          break;
        case 2:
          await lastMessage.react('1️⃣');
          await lastMessage.react('2️⃣');
          break;
        case 1:
          await lastMessage.react('1️⃣');
          break;
      }

      // 发送确认消息
      const confirm = new Discord.MessageEmbed()
        .setColor("GREEN")
        .setDescription("Szavazás létrehozva. Reagálj a megfelelő emojival a szavazáshoz!");
      await channel.send(confirm);

    } catch (err) {
      // 添加错误捕获,方便后续排查问题
      console.error('Vote command error:', err);
      message.channel.send('Hiba történt a szavazás létrehozása közben!');
    }
  }
};

关键改动说明

  1. 替换废弃API:把channel.fetchMessages改成channel.messages.fetch,这是让反应逻辑正常执行的核心修复。
  2. 改用async/await:替代嵌套的Promise链,让代码更易读和维护,同时确保异步操作按顺序执行。
  3. 调整删除超时:把timeout:1改成timeout:1000,给删除操作足够的时间完成。
  4. 正确比较成员:用lastMessage.member.equals(message.member)替代直接的!=,确保成员比较准确。
  5. 添加错误捕获:用try/catch包裹异步操作,方便排查后续可能出现的问题。
  6. 优化switch逻辑:使用parseInt后的数字parameter进行判断,避免字符串匹配的潜在问题。

内容的提问来源于stack exchange,提问作者Bozai Ákos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:37:57