首页 > 解决方案 > 我似乎找不到 DiscordAPIError: Unknown Message 的解决方案

问题描述

我正在使用 discord.js v13,我得到的提示是我可能在message.delete()功能上有问题。但是,我尝试将其包围在 a 中,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 它只会发送错误然后使消息对作者可见,但对其他人不可见。这意味着它可以工作并且确实会删除,而不是对作者并抛出该错误。

标签: javascriptdiscorddiscord.js

解决方案


        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块中,default您的switch语句的情况是删除message如果不满足上述条件。那也行。该代码有效并且message成功删除。

但是在第二个中,您正在尝试delete相同message的 . 但是,它不再存在,因为defaultswitch 块中的情况将始终 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);
    }


推荐阅读