discord.js v13迁移后guildBanAdd事件无法向被封禁用户发消息排查
问题排查与修复
你的代码存在以下核心问题:
- discord.js v13 中
guildBanAdd事件的参数结构变更:v12 版本传递(guild, user)两个参数,v13 版本仅传递1个GuildBan类型的参数,需要从该参数中解构获取guild和user属性。 - 模板字符串语法错误:你使用双引号包裹需要插值的内容,
${guild.name}不会被正常解析,必须用反引号`包裹模板字符串。 - 消息发送格式错误:v13 版本中发送嵌入消息不能直接将 embed 实例作为
send方法的参数,需要放在embeds数组中传递。 - 缺少必要配置与错误处理:v13 要求必须显式启用
GUILD_BANS网关意图,否则guildBanAdd事件不会触发;同时需要添加错误捕获逻辑,若目标用户关闭了陌生人私信权限,user.send会抛出异常导致程序崩溃。 - 变量大小写匹配问题:若你的客户端实例命名为小写
client,代码中大写开头的Client.on会导致事件绑定失败,需要和你的实例变量名保持一致。
修正后的代码示例
客户端初始化(必须启用对应意图)
const { Client, Intents } = require('discord.js'); // 替换为你自己的实例命名,保持统一 const client = new Client({ intents: [ Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_BANS, // 必须启用该意图才能接收封禁事件 // 其他你业务需要的其余意图 ] });
事件监听部分
client.on("guildBanAdd", async (ban) => { // 从GuildBan对象中解构出服务器、用户信息 const { guild, user } = ban; // 替换为你自己的封禁描述内容,确保变量已定义 const banDesc = "你违反了服务器规则,已被永久封禁"; const embed = new Discord.MessageEmbed() .setTitle(`You were banned from ${guild.name}!`) .setColor("Red") .setDescription(banDesc); // 捕获发信失败异常,避免程序崩溃 try { await user.send({ embeds: [embed] }); } catch (err) { console.log(`无法向用户 ${user.tag} 发送封禁通知:${err.message}`); } });
内容的提问来源于stack exchange,提问作者user17132312
相关产品推荐
相关产品推荐

