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

如何在Discord.js中检测interaction.reply消息是否已删除?

解决Discord.js中检测交互回复消息是否被删除的方法

一、用fetchReply提前验证消息状态

每次要对交互回复做后续操作(比如编辑、删除)前,先尝试获取这条消息,失败且错误码为10008时,就说明消息已经被删除了:

async function isReplyAlive(interaction) {
  try {
    await interaction.fetchReply();
    return true;
  } catch (err) {
    if (err.code === 10008) { // 对应"Unknown Message"错误
      return false;
    }
    // 其他类型的错误按需处理,这里直接抛出
    throw err;
  }
}

// 实际使用
if (await isReplyAlive(interaction)) {
  await interaction.editReply("更新后的回复内容");
} else {
  await interaction.followUp("之前的回复已被删除,这是新消息");
}

二、监听消息删除事件记录已删消息

在机器人启动时监听全局的messageDelete事件,把机器人发送的交互回复消息ID存起来,后续操作前直接查记录:

// 用Set存储已删除的机器人消息ID,查询效率高
const deletedBotMessages = new Set();

client.on('messageDelete', (msg) => {
  // 只记录机器人自己发的消息
  if (msg.author.id === client.user.id) {
    deletedBotMessages.add(msg.id);
  }
});

// 检查方法
async function checkIfReplyDeleted(interaction) {
  // 如果已经保存过回复的消息ID,直接查Set
  if (interaction.replied && interaction.message?.id) {
    return deletedBotMessages.has(interaction.message.id);
  }
  // 没保存过的话还是用fetchReply兜底
  return !(await isReplyAlive(interaction));
}

三、操作时直接捕获错误兜底

要是不想提前做检查,也可以在执行editReply这类操作时直接捕获错误,针对性处理“Unknown Message”的情况:

try {
  await interaction.editReply("尝试更新回复");
} catch (err) {
  if (err.code === 10008) {
    // 消息已删,执行替代逻辑
    await interaction.followUp("原回复已被删除,无法完成更新");
  } else {
    // 其他错误正常抛出或处理
    throw err;
  }
}

内容的提问来源于stack exchange,提问作者Termin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:35:19