
discord.js v14+ 中 `messagedelete` 事件不触发,通常是因为缺失必要的 `partials` 配置——需显式启用 `partials.message` 才能接收已删除消息的完整数据。
在 Discord.js v14(基于 @discordjs/rest 和 @discordjs/core)中,messageDelete 事件默认不会触发,除非你在客户端初始化时正确配置了 partials。这是因为当一条消息被删除时,Discord 不会主动推送其完整对象(尤其是跨进程或缓存失效场景),而仅提供一个轻量级的“骨架”事件;若未声明 Partials.Message,该事件将被完全忽略。
✅ 正确做法:在创建 Client 实例时,必须添加 partials: [Partials.Message](推荐同时包含其他常用 partials 以保障兼容性):
const { Client, GatewayIntentBits, Partials } = require('discord.js');
const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent, // ✅ 必须启用(用于读取 content)
GatewayIntentBits.DirectMessages,
GatewayIntentBits.DirectMessageReactions,
GatewayIntentBits.GuildModeration,
GatewayIntentBits.GuildEmojisAndStickers
],
partials: [
Partials.Message, // ✅ 关键!使 messageDelete / messageUpdate 可触发
Partials.Channel, // 支持从 DM 或已解散频道恢复上下文
Partials.User, // 确保 author、member 等字段可解析
Partials.GuildMember, // 用于获取被删消息作者的成员信息(如昵称)
Partials.Reaction // 如后续扩展日志含反应删除,也建议保留
]
});⚠️ 注意事项:
- GatewayIntentBits.MessageContent 不可省略:它决定了你能否访问 message.content、附件、embed 等敏感字段(无此 intent 将返回空字符串或 null);
- 日志频道权限需确保 Bot 在目标服务器中拥有 ViewChannel 和 SendMessages 权限;
- 若消息来自私信(DM)或已被移出服务器的用户,message.author 可能为 null,建议添加空值防护:
if (!message.author) {
embed.setDescription("A message was deleted by an unknown or unavailable user.");
} else {
embed.setDescription(`A message was deleted by <@${message.author.id}>.`);
embed.addFields({
name: "Content:",
value: message.content || "(empty or inaccessible)"
});
}? 补充说明:partials 是 Discord.js v14 的核心变更之一,旨在提升内存效率与事件可靠性。未配置 Partials.Message 时,即使 intent 全开,messageDelete 也不会被监听器捕获——这不是 bug,而是设计行为。
完成配置后重启 Bot,即可稳定捕获并记录所有可访问范围内的消息删除事件。










