Discord.js机器人删除消息时报错10008(Unknown Message)如何解决?
问题原因
你遇到的报错码10008代表目标消息已不存在,和你猜测的原因一致:触发删除逻辑时,消息已经被其他主体(比如发消息的机器人、消息发送者、频道管理员)提前删除了。
解决方案
方案1:直接捕获删除操作的异常(推荐)
提前检测消息是否存在需要额外调用Discord接口,效率更低,直接在删除操作的Promise回调中捕获异常是最优解,只需要修改setTimeout中的代码,给msg.delete()添加catch处理即可:
client.on("messageCreate", msg => { let borrar = false; let delay = 0; if (msg.author.username === 'Ayana') { delay = 10000; borrar = true; } if (msg.content.startsWith('=') || msg.content.startsWith('-')) { delay = 15000; borrar = true; } if (borrar) { setTimeout(() => { msg.delete() .catch(err => { // 错误码10008为消息不存在,直接忽略即可 if (err.code !== 10008) { // 其他错误比如无权限等,可以按需打印日志排查 console.error('删除消息失败:', err) } }) }, delay); } }) // Borra comandos y respuestas de bots
方案2:提前检测消息是否存在(可选)
如果确实需要提前判断消息状态,可以先调用频道的消息fetch方法查询目标消息是否存在,存在再执行删除:
setTimeout(async () => { try { // 尝试拉取目标消息,拉取成功说明消息存在 await msg.channel.messages.fetch(msg.id); await msg.delete(); } catch (err) { // 拉取失败或者删除失败都在这里处理,同样可以过滤10008错误 if (err.code !== 10008) { console.error('操作失败:', err) } } }, delay)
注意事项
- 确保你的机器人已经被授予对应频道的管理消息权限,否则会出现403权限不足的错误
- 不要直接依赖
msg.deleted属性判断,这个属性只在当前客户端缓存中标记了消息是否被你的机器人删除,其他主体删除的消息不会更新这个属性,判断结果不可靠
内容的提问来源于stack exchange,提问作者Cristian David Moraleda
相关产品推荐
相关产品推荐

