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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:09:01