首页 > 解决方案 > DiscordAPIError:未知消息 - 如何在尝试删除消息之前检查消息是否已删除

问题描述

在如下假设的情况下,机器人可以发送一个嵌入然后在 3 秒内删除该消息。

message.reply({ embeds: [embed] })
.then((msg) => {
setTimeout(() => msg.delete(), 3000)
})

当用户在机器人之前删除消息时,机器人崩溃并且我收到此错误:

C:\Users\\Documents\GitHub\omex\node_modules\discord.js\src\rest\RequestHandler.js:298
      throw new DiscordAPIError(data, res.status, request);
            ^

DiscordAPIError: Unknown Message
    at RequestHandler.execute (C:\Users\\Documents\GitHub\\node_modules\discord.js\src\rest\RequestHandler.js:298:13)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async RequestHandler.push (C:\Users\\Documents\GitHub\\node_modules\discord.js\src\rest\RequestHandler.js:50:14)
    at async MessageManager.delete (C:\Users\\Documents\GitHub\\node_modules\discord.js\src\managers\MessageManager.js:205:5)
    at async Message.delete (C:\Users\\Documents\GitHub\\node_modules\discord.js\src\structures\Message.js:709:5) {
  method: 'delete',
  path: '/channels/877943546932494377/messages/888575942379847681',
  code: 10008,
  httpStatus: 404,
  requestData: { json: undefined, files: [] }
}

那么有没有办法在尝试删除之前检测消息是否被删除?

标签: discorddiscord.js

解决方案


通过TayDex构建此答案,您应该在超时结束后进行检查。原因是一旦计时器启动,消息可能会在倒计时的 3 秒内被删除。Message#deleted

此外,您可以添加catch()回调以Message#delete()进行错误处理和防止崩溃。

message.reply({ embeds: [embed] })
.then(msg => {
   setTimeout(() => {
      if (!msg.deleted) {
         msg.delete()
         .catch(err => {
            console.log('An error occurred but the bot is still running')
            console.error(err)
         })
      }
   }, 3000)
})

推荐阅读