【问题标题】:I can't seem to find the solution to a DiscordAPIError: Unknown Message我似乎找不到 DiscordAPIError: Unknown Message 的解决方案
【发布时间】:2021-11-19 01:13:28
【问题描述】:

我正在使用 discord.js v13,我得到提示,我可能对 message.delete() 功能有问题。但是,我尝试将它包围在 try/catch statement 中,但我仍然收到错误消息。我不确定它是如何触发的,但它仍然会删除消息,但仍会保持消息对作者可见。

我的代码:

if(message.content.startsWith(PREFIX)) {
    if(message.channel.id != ChannelID) return message.channel.send({ embeds: [wrongChannel] }) && message.delete({ timeout: 1000 });
    switch(args[0]) {
        case "help":
            client.commands.get('help').run(client, message);
            break;
        case "ping":
            client.commands.get('ping').run(client, message, args);
            break;
        case "ban":
            client.commands.get('ban').run(client, message, args);
            break;
        case "kick":
            client.commands.get('kick').run(client, message, args);
            break;
        case "mute":
            client.commands.get('mute').run(client, message, args);
            break;
        default:
            message.channel.send({ embeds: [err] });
            try {
                await message.delete({ timeout: 1000 });
            } catch (e) {
                console.error(e);
            }
    }
    try {
        await message.delete({ timeout: 1000 });
    } catch (e) {
        console.error(e);
    }
}

错误:

DiscordAPIError: Unknown Message
    at RequestHandler.execute (D:\Discord Bots\test\node_modules\discord.js\src\rest\RequestHandler.js:298:13)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async RequestHandler.push (D:\Discord Bots\test\node_modules\discord.js\src\rest\RequestHandler.js:50:14)
    at async MessageManager.delete (D:\Discord Bots\test\node_modules\discord.js\src\managers\MessageManager.js:205:5)
    at async Message.delete (D:\Discord Bots\test\node_modules\discord.js\src\structures\Message.js:709:5)
    at async Client.<anonymous> (D:\Discord Bots\test\index.js:72:13) {
  method: 'delete',
  path: '/channels/891701894559461407/messages/891720458859331585',
  code: 10008,
  httpStatus: 404,
  requestData: { json: undefined, files: [] }
}

这是为了检查命令是否在错误频道中执行,然后它将向他们发送我制作的嵌入并删除消息。如果不是,但他们已经正确输入了命令,在正确输入后它将被删除,反之亦然。输入错误后,它将发送嵌入并将其删除。如果没有 try/catch,它只会让作者看到它并使机器人崩溃。但是使用 try/catch 它只会发送错误然后使消息对作者可见,但对其他人不可见。这意味着它可以工作并且确实会删除,而不是对作者并抛出该错误。

【问题讨论】:

  • 嗨!您正在使用 await,但它是否在 async 函数中有效地等待承诺,然后再继续其工作?
  • 有人告诉我添加await,但没有任何区别
  • 好的,我刚刚注意到在您的代码中,您将其删除了两次,这是为了什么?如果default: 部分(第一次调用)已完成,那么我在第二次调用时收到404 错误也就不足为奇了。我知道,它不处理消息保持可见的事实

标签: javascript discord discord.js


【解决方案1】:
        default:
            message.channel.send({ embeds: [err] });
            // first try/catch
            try {
                await message.delete({ timeout: 1000 });
            } catch (e) {
                console.error(e);
            }
    }
    // second try/catch
    try {
        await message.delete({ timeout: 1000 });
    } catch (e) {
        console.error(e);
    }
}

在第一个try/catch 块中,switch 语句的default 情况是如果以上条件都不满足,则删除message。没事儿。代码有效,message 被成功删除。

但是在第二个中,您正在尝试delete 相同的message。但是,它不再存在,因为 switch 块中的 default 案例将始终 delete 它,因此没有对它的引用并且 Discord 抛出 DiscordAPIError。因此,您不能再次拨打message.delete()

要修复它,只需删除第二个 try/catch 块:

if(message.content.startsWith(PREFIX)) {
    if(message.channel.id != ChannelID) return message.channel.send({ embeds: [wrongChannel] }) && message.delete({ timeout: 1000 });
    switch(args[0]) {
        case "help":
            client.commands.get('help').run(client, message);
            break;
        case "ping":
            client.commands.get('ping').run(client, message, args);
            break;
        case "ban":
            client.commands.get('ban').run(client, message, args);
            break;
        case "kick":
            client.commands.get('kick').run(client, message, args);
            break;
        case "mute":
            client.commands.get('mute').run(client, message, args);
            break;
        default:
            // will always delete if conditions aren't met
            message.channel.send({ embeds: [err] });
            try {
                await message.delete({ timeout: 1000 });
            } catch (e) {
                console.error(e);
            }
    }

如果这行得通,请告诉我。

编辑:如果您希望机器人删除用户消息而不考虑正确性

if(message.content.startsWith(PREFIX)) {
    if(message.channel.id != ChannelID) return message.channel.send({ embeds: [wrongChannel] }) && message.delete({ timeout: 1000 });
    switch(args[0]) {
        case "help":
            client.commands.get('help').run(client, message);
            break;
        case "ping":
            client.commands.get('ping').run(client, message, args);
            break;
        case "ban":
            client.commands.get('ban').run(client, message, args);
            break;
        case "kick":
            client.commands.get('kick').run(client, message, args);
            break;
        case "mute":
            client.commands.get('mute').run(client, message, args);
            break;
        default:
            message.channel.send({ embeds: [err] });
    }
    // will always delete
    try {
        await message.delete({ timeout: 1000 });
    } catch (e) {
        console.error(e);
    }

【讨论】:

  • 问题是,只有在他们输入错误的情况下,如果他们输入正确怎么办?它不会删除。除非我只是在每个案例中添加try/catch 声明。有点溢出,但我想这行得通。编辑:它不再抛出错误,我在每个案例中都添加了try/catch。但是,discord 有一些奇怪的问题,即使它已被删除,它仍然会显示我的消息,并且它需要我 CTRL + R 刷新 discord 以便它消失。
  • 在这种情况下,您可以将默认情况下的代码移动到外部范围。这样可以确保始终删除消息。
  • 回复你的评论,本来是这样的,但是如果我输入错误,它会抛出一个错误,让机器人崩溃并保留消息
  • @bonoxe7475 编辑了答案。看看这是否有效。
  • 是的,我知道,请重新阅读我的评论
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-07
  • 2021-04-03
  • 2016-06-08
  • 1970-01-01
  • 2019-11-25
  • 2020-09-23
相关资源
最近更新 更多