Discord.js v12中!vote命令无法添加消息反应的问题求助
问题分析与修复方案
你的!vote命令失效的核心原因是Discord.js v12的API变更,再加上代码里的几个细节问题,导致添加反应的逻辑根本没执行。让我一步步拆解并给出修复方案:
核心问题:废弃API调用
Discord.js v12中,channel.fetchMessages()方法已被完全移除,取而代之的是channel.messages.fetch()。你原代码调用了不存在的方法,导致Promise链抛出错误,但因为没有错误捕获,后续的反应逻辑直接被跳过;而确认消息因为在Promise链之外,所以正常发送——这就是为什么你只看到反馈却没有反应的原因。
其他次要问题
message.delete({ timeout: 1 })的timeout单位是毫秒,1毫秒几乎瞬间执行,可能导致删除操作还未完成就开始拉取消息,引发逻辑混乱。- 对象比较方式错误:直接用
!=比较GuildMember对象(lastMessage.member != message.member)是引用比较,不可靠,应该用GuildMember的equals()方法。 - 代码嵌套过深,且在
execute函数内部才引入Discord.js,不符合最佳实践。 - 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!'); } } };
关键改动说明
- 替换废弃API:把
channel.fetchMessages改成channel.messages.fetch,这是让反应逻辑正常执行的核心修复。 - 改用async/await:替代嵌套的Promise链,让代码更易读和维护,同时确保异步操作按顺序执行。
- 调整删除超时:把
timeout:1改成timeout:1000,给删除操作足够的时间完成。 - 正确比较成员:用
lastMessage.member.equals(message.member)替代直接的!=,确保成员比较准确。 - 添加错误捕获:用try/catch包裹异步操作,方便排查后续可能出现的问题。
- 优化switch逻辑:使用
parseInt后的数字parameter进行判断,避免字符串匹配的潜在问题。
内容的提问来源于stack exchange,提问作者Bozai Ákos
相关产品推荐
相关产品推荐

