Discord.js v12.22.1机器人踢出高角色用户时自动关闭报错如何解决
问题根因
GuildMember.kick() 是异步方法,返回Promise对象,当机器人没有权限踢出目标用户(比如目标角色等级高于机器人、目标是服务器所有者、机器人自身没有踢人权限)时,该Promise会进入rejected状态,你的代码没有对这个异常做捕获处理,就会触发Node.js的未处理Promise拒绝告警,最终导致进程退出。
修复方案
- 第一步:补充权限前置校验
先做权限预判断,避免无效的踢人请求:const botMember = message.guild.me; // 校验机器人自身是否有踢人权限 if (!botMember.hasPermission('KICK_MEMBERS')) { return message.channel.send(`${tag} 我没有踢出成员的权限,无法完成操作`); } // 校验目标是否为服务器所有者 if (targetMember.id === message.guild.ownerID) { return message.channel.send(`${tag} 无法踢出服务器所有者`); } // 校验目标的最高角色等级是否低于机器人的最高角色等级 if (targetMember.roles.highest.position >= botMember.roles.highest.position) { return message.channel.send(`${tag} 该用户的角色等级高于我,我无法踢出他`); } - 第二步:捕获异步操作异常
给kick方法添加错误处理,避免未捕获的Promise拒绝导致进程崩溃,两种实现方式二选一即可:
方式1:async/await + try/catch(推荐)
先将你当前的命令处理函数修改为async函数,再包裹踢人逻辑:
方式2:链式调用.catch()try { await targetMember.kick(); const embed = new Discord.MessageEmbed() .setColor('RANDOM') .setDescription(`that user has been KICKED`); message.channel.send(embed); } catch (err) { console.error('踢出用户失败:', err); message.channel.send(`${tag} 踢出操作失败,请稍后重试`); }
无需修改上层函数的异步声明:targetMember.kick() .then(() => { const embed = new Discord.MessageEmbed() .setColor('RANDOM') .setDescription(`that user has been KICKED`); message.channel.send(embed); }) .catch(err => { console.error('踢出用户失败:', err); message.channel.send(`${tag} 踢出操作失败,请稍后重试`); });
完整修正代码参考
const { member, mentions } = message const tag = `<@${member.id}>` const botMember = message.guild.me; if (member.hasPermission('KICK_MEMBERS')) { const target = mentions.users.first() if (target) { const targetMember = message.guild.members.cache.get(target.id) // 前置权限校验 if (!botMember.hasPermission('KICK_MEMBERS')) { return message.channel.send(`${tag} 我没有踢出成员的权限,无法完成操作`); } if (targetMember.id === message.guild.ownerID) { return message.channel.send(`${tag} 无法踢出服务器所有者`); } if (targetMember.roles.highest.position >= botMember.roles.highest.position) { return message.channel.send(`${tag} 该用户的角色等级高于我,我无法踢出他`); } // 带错误处理的踢人逻辑 targetMember.kick() .then(() => { const embed = new Discord.MessageEmbed() .setColor('RANDOM') .setDescription(`that user has been KICKED`); message.channel.send(embed); }) .catch(err => { console.error('踢出用户失败:', err); message.channel.send(`${tag} 踢出操作失败,请稍后重试`); }); } else { message.channel.send(`${tag} Please specify someone to kick.`) } } else { message.channel.send( `${tag} You do not have permission to use this command.` ) }
内容的提问来源于stack exchange,提问作者lelbro420
相关产品推荐
相关产品推荐

