Discord.js 12.5.1 封禁服务器外用户时机器人崩溃如何解决?
问题根源&修复方案
导致崩溃&功能异常的核心原因
- 你当前的
toBan取值逻辑仅从服务器本地成员缓存message.guild.members.cache中查找,不在服务器的用户自然找不到,此时toBan会变为undefined,后续访问toBan.bannable、toBan.roles等属性时直接触发未定义属性错误导致崩溃 - 初始参数校验逻辑错误:
args是数组,slice之后永远不会为空,if(!args)判断完全无效,应该校验args[0]是否存在 - 封禁方法调用错误:你写的
member.ban里member根本没有定义,而且封禁不在服务器的用户需要调用guild.members.ban()方法直接传用户ID,不需要先获取成员对象 - 逻辑顺序错误:你没有先判断
toBan是否存在就直接访问其属性,只要ID无效/用户不在服务器就直接崩溃 - 身份对比逻辑错误:
toBan是成员对象,message.author是用户对象,直接===永远不会成立,应该对比ID值 - 短ID场景下,
toBan查找不到直接变为undefined,触发崩溃
修复后可正常运行的代码
let args = messageArray.slice(1); if(message.content.startsWith(prefix + 'ban')) { // 先校验参数 if(!args[0]) return message.channel.send('你需要指定要封禁的用户!') // 先校验操作人权限 if (!message.member.hasPermission("VIEW_AUDIT_LOG")) return message.channel.send("你的权限不足。") if (!message.guild.me.hasPermission("BAN_MEMBERS")) return message.channel.send("我没有封禁成员的权限。") let toBan; // 优先找服务器内的成员 const targetInGuild = message.guild.members.cache.get(args[0]) || message.mentions.members.first() || message.guild.members.cache.find(x => x.user.username.toLowerCase() === args.join(" ") || x.user.username === args[0]); if (targetInGuild) { toBan = targetInGuild; // 服务器内成员额外校验 if(!toBan.bannable) return message.channel.send("我无法封禁该用户!") if(toBan.id === message.author.id) return message.channel.send("你不能封禁自己。") if(toBan.roles.highest.position >= message.member.roles.highest.position && message.guild.ownerId !== message.author.id) return message.channel.send("你无法封禁角色等级高于或等于你的用户。") } else { // 不在服务器的用户直接取输入的ID作为封禁目标 toBan = args[0]; // 校验ID合法性,discord用户ID都是17-19位数字,避免1位无效ID触发问题 if (!/^\d{17,19}$/.test(toBan)) return message.channel.send("请输入有效的用户ID、@提及或用户名。") } const reason = args.slice(1).join(" ") || "未指定原因"; // 调用guild的ban方法,支持传ID直接封禁不在服务器的用户 message.guild.members.ban(toBan, { reason: reason }) .then(bannedUser => { message.channel.send(`已成功将${bannedUser.tag || `<@${toBan}>`}从服务器封禁,操作者:${message.author},原因:${reason}`) }) .catch(err => { message.channel.send("封禁失败,请检查ID是否正确,或目标用户的权限高于我。") console.error(err) }) }
内容的提问来源于stack exchange,提问作者Lyasm
相关产品推荐
相关产品推荐

