discord.js v13开发投票机器人触发msg.react is not a function报错
问题原因分析
- 核心问题是你混用了第三方库
discord-slash-commands-client和discord.js v13内置的交互处理逻辑。discord.js v13已经原生支持斜杠命令的注册、接收、处理全流程,第三方库的交互对象和discord.js原生对象结构不兼容,导致你调用interaction.reply加fetchReply: true返回的不是标准的discord.jsMessage实例,自然没有react方法。 - 额外小问题:你用第三方库注册命令时,空选项的
options字段应该传空数组[]而不是空对象{},不过这个不是你当前报错的直接原因。
修复方案
第一步:卸载无用第三方依赖
执行命令:npm uninstall discord-slash-commands-client
第二步:改用discord.js内置逻辑注册斜杠命令
在你的client.on('ready')事件里加入内置注册逻辑,示例代码如下:
const { REST, Routes } = require('discord.js'); client.on('ready', async () => { console.log(`Logged in as ${client.user.tag}!`); const rest = new REST({ version: '10' }).setToken(token); // 注册全局命令,生效需要1小时左右,测试可以换成公会命令即时生效 try { await rest.put( Routes.applicationCommands(applicationID), { body: [ { name: "kamelott", description: "Generation de citation kamelott aléatoire sans argument", options: [] }, { name: "sondage", description: "Création de sondage", options:[ { name: "sentence", description: "Question du sondage", type: 3, required: true } ] } ] } ); console.log('斜杠命令注册成功'); } catch (error) { console.error(error); } });
第三步:调整投票逻辑确保反应按顺序添加
你原有的sondage命令逻辑里,补全第二个反应的添加即可,修改后代码:
}else if(commandName === 'sondage'){ sentence = interaction.options.getString('sentence') ; let pollEmbed = new Discord.MessageEmbed() .setTitle('Question') .setDescription(sentence +"\n\nVeuillez répondre à ce sondage par le biais de ces réacations :white_check_mark: ou :negative_squared_cross_mark: ") .setAuthor(interaction.user.username) .setTimestamp() .setFooter(""); try { const msg = await interaction.reply({ embeds: [pollEmbed] , fetchReply: true }); // 按顺序添加两个反应,加await避免顺序错乱 await msg.react('✅'); await msg.react('❌'); } catch (error) { console.log('------------------------'); console.log("Erreur avec le sondage"); console.log(error); console.log('------------------------'); } }
内容的提问来源于stack exchange,提问作者Agriesean
相关产品推荐
相关产品推荐

