Discord.js v13 如何修复下拉菜单触发时多条父消息同时被编辑问题
问题原因
你的代码存在两个核心问题:
- 每次执行斜杠命令时,你都在命令回调内新增了一个全局的
interactionCreate事件监听器,旧的监听器不会被销毁,触发下拉菜单时所有历史注册的监听器都会同时执行 - 每个监听器都闭包引用了对应斜杠命令触发时的
interaction对象,执行interaction.editReply时就会编辑对应历史命令的回复消息,导致所有历史消息被同步修改
修复方案
全局仅注册一次interactionCreate事件监听,触发下拉菜单时直接使用菜单交互实例自带的update方法,该方法默认只会编辑当前触发菜单的所属父消息,不会影响其他历史消息。
修改后的完整代码如下:
斜杠命令回调内代码
const row = new MessageActionRow() .addComponents( new MessageSelectMenu() .setCustomId('letter_select') .setPlaceholder('Letter') .addOptions([ { label: 'A', value: 'A', }, { label: 'B', value: 'B', }, { label: 'C', value: 'C', }, { label: 'D', value: 'D', }, ]), ); await interaction.reply({content: "Select a letter!", components: [row]})
全局事件监听代码(放在斜杠命令回调外,仅执行一次)
client.on("interactionCreate", async menuInteraction => { if (!menuInteraction.isSelectMenu()) return; // 过滤非当前业务的下拉菜单交互 if (menuInteraction.customId !== 'letter_select') return; // 直接更新当前触发菜单的父消息 await menuInteraction.update({ content: menuInteraction.values[0] }); });
内容的提问来源于stack exchange,提问作者user14298306
相关产品推荐
相关产品推荐

