
在Discord.js机器人开发中,DiscordAPIError[10062]: Unknown interaction是一个常见的错误,它表示机器人尝试对一个已经无效或已被处理的交互(Interaction)进行操作。
错误原因: Discord API对交互的响应有严格的时间限制和状态管理:
在提供的代码示例中,错误栈指向InteractionCollector.<anonymous> (...\buttons\moderates\listRaiting.js:51:7),这强烈暗示listRaiting.js中的处理逻辑在尝试更新交互时,该交互已经失效或已被其他地方处理。
原始代码中,moderate斜杠命令旨在创建一个包含多个按钮的面板。它创建了一个主收集器来监听所有这些按钮的点击事件。
// 原始代码片段
const collectors = {}; // 全局或模块级对象,用于存储收集器
async function createCollector(interaction, customId, executeFunction) {
// ... 此函数创建一个针对特定 customId 的收集器 ...
}
module.exports = {
// ...
async execute(interaction) {
// ... 角色检查 ...
// 尝试停止所有旧的收集器,但这里的实现可能不完善
for (let collector in collectors) {
collectors[collector].stop();
}
const filter = i => i.user.id === interaction.user.id;
const collector = interaction.channel.createMessageComponentCollector({ filter, time: 30000 }); // 主面板收集器
// ... 构建并发送嵌入消息和按钮 ...
collector.on('collect', async i => {
switch (i.customId) {
case 'mute':
await muteButton.execute(i); // 这里调用了外部模块的 execute 方法
break;
// ... 其他按钮处理 ...
}
});
collector.on('end', collected => {
console.log(`Collector для реакций завершен. Собрано ${collected.size} элементов.`);
});
},
};潜在问题分析:
这是解决“未知交互”错误最关键的一步。所有处理按钮交互的函数都必须在3秒内发送响应。
实现方式:
在每个处理按钮点击的模块(如muteButton.js, listRaiting.js等)的execute方法中,首先使用interaction.deferUpdate()或interaction.deferReply({ ephemeral: true })来告知Discord你正在处理这个交互。
示例代码(buttons/moderates/listRaiting.js):
// buttons/moderates/listRaiting.js
module.exports = {
async execute(interaction) {
// 1. 立即告知Discord正在处理该交互
// 如果你的操作需要较长时间,使用 deferUpdate() 或 deferReply()
// deferUpdate() 会使按钮显示加载状态,不发送新消息
// deferReply() 会发送一个临时或永久的回复
if (interaction.deferred || interaction.replied) {
// 如果交互已经被推迟或回复,则避免重复操作
return;
}
await interaction.deferUpdate(); // 或者 await interaction.deferReply({ ephemeral: true });
try {
// 2. 执行你的业务逻辑
// 例如,获取评分列表,构建嵌入消息
const raitingList = await fetchRaitingList(); // 假设这是一个异步操作
const embed = new EmbedBuilder()
.setColor(0x00FF00)
.setTitle('当前评分用户列表')
.setDescription(raitingList.length > 0 ? raitingList.map(user => `- ${user.username}`).join('\n') : '目前没有评分用户。');
// 3. 更新原始消息或发送后续消息
// 注意:deferUpdate() 后,可以使用 editReply() 或 followUp()
await interaction.editReply({ embeds: [embed], components: [] }); // 更新原始消息,移除按钮
// 或者 await interaction.followUp({ embeds: [embed], ephemeral: true }); // 发送一个新消息
} catch (error) {
console.error('处理listRaiting按钮时发生错误:', error);
// 4. 错误处理,确保用户得到反馈
await interaction.followUp({ content: '获取评分列表时发生错误。', ephemeral: true });
}
},
};注意事项:
为了避免多个moderate命令面板同时活跃导致的冲突,我们需要一个更健壮的机制来存储和停止旧的收集器。使用Map来存储以用户ID和频道ID为键的收集器是一个好方法。
实现方式:
创建一个Map来存储活跃的收集器,并在每次/moderate命令执行时,检查并停止之前为同一用户/频道创建的收集器。
示例代码(commands/moderate.js):
const { SlashCommandBuilder } = require('@discordjs/builders');
const {
ActionRowBuilder,
ButtonBuilder,
EmbedBuilder,
ButtonStyle,
} = require('discord.js');
// 导入所有按钮处理模块
const muteButton = require('../../buttons/moderates/muteButton.js');
const unMuteButton = require('../../buttons/moderates/unMuteButton.js');
const warnButton = require('../../buttons/moderates/warnButton.js');
const unWarnButton = require('../../buttons/moderates/unWarnButton.js');
const listRaitingButton = require('../../buttons/moderates/listRaiting.js');
const infractionButton = require('../../buttons/moderates/infractionButton.js');
const raitingButton = require('../../buttons/moderates/raitingButton.js');
const unRaitingButton = require('../../buttons/moderates/unraitingButton.js');
// 使用 Map 来存储活跃的面板收集器
// 键可以是 `${userId}-${channelId}`,值是 MessageComponentCollector 实例
const activePanelCollectors = new Map();
module.exports = {
data: new SlashCommandBuilder()
.setName('moderate')
.setDescription('提供一个管理面板,包含禁言、解禁、警告等操作。'),
async execute(interaction) {
const member = interaction.member;
const moderatorRole = member.roles.cache.find(r => r.name === 'Модератор');
if (!moderatorRole) {
return interaction.以上就是Discord.js 按钮收集器管理:避免“未知交互”错误的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号