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

discord.js v13调用message.delete报DiscordAPIError: Unknown Message问题问询

问题根因

  • 代码存在重复删除同一条消息的逻辑:default分支内已经执行过一次message.delete(),switch语句执行结束后外层还会再执行一次删除,第一次删除成功后消息已不存在,第二次请求就会返回404 Unknown Message错误。
  • discord.js v13 已经移除了message.delete()的timeout配置项,你传入的延迟删除参数不生效,会直接触发删除请求,进一步加重重复删除的冲突。
  • 消息对发送者残留可见是客户端缓存导致:删除请求报错时,发送者客户端没有收到服务端的消息删除推送,就会出现本地缓存残留、其他用户已经看不到该消息的情况。

修复方案

  1. 移除重复的删除逻辑,统一在所有分支出口只执行一次删除
  2. 改用setTimeout实现延迟删除,兼容v13版本规范
  3. 保留try/catch捕获异常避免程序崩溃

修复后的参考代码:

// 注意:使用await的外层函数需要标记为async
if(message.content.startsWith(PREFIX)) {
    if(message.channel.id != ChannelID) {
        await message.channel.send({ embeds: [wrongChannel] });
        // 延迟1s删除用户指令消息
        setTimeout(async () => {
            try {
                await message.delete();
            } catch (e) {
                console.error(e);
            }
        }, 1000);
        return;
    }
    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:
            await message.channel.send({ embeds: [err] });
            break;
    }
    // 统一执行删除,所有合法频道的指令只删一次
    setTimeout(async () => {
        try {
            await message.delete();
        } catch (e) {
            console.error(e);
        }
    }, 1000);
}

如果你的指令执行函数内部本身也有删除触发消息的逻辑,需要对应调整避免和外层删除逻辑重复。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:24:03