discord.js v13调用message.delete报DiscordAPIError: Unknown Message问题问询
问题根因
- 代码存在重复删除同一条消息的逻辑:default分支内已经执行过一次
message.delete(),switch语句执行结束后外层还会再执行一次删除,第一次删除成功后消息已不存在,第二次请求就会返回404 Unknown Message错误。 - discord.js v13 已经移除了
message.delete()的timeout配置项,你传入的延迟删除参数不生效,会直接触发删除请求,进一步加重重复删除的冲突。 - 消息对发送者残留可见是客户端缓存导致:删除请求报错时,发送者客户端没有收到服务端的消息删除推送,就会出现本地缓存残留、其他用户已经看不到该消息的情况。
修复方案
- 移除重复的删除逻辑,统一在所有分支出口只执行一次删除
- 改用
setTimeout实现延迟删除,兼容v13版本规范 - 保留
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
相关产品推荐
相关产品推荐

