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

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函数,再包裹踢人逻辑:
    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} 踢出操作失败,请稍后重试`);
    }
    
    方式2:链式调用.catch()
    无需修改上层函数的异步声明:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:33:02