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

Discord.js unban命令.catch失效、UnhandledPromiseRejectionWarning报错如何修复?

Discord机器人ban/unban命令修复方案

核心错误说明

  • 拼写错误:ban命令中message.mention.members.first()拼写错误,应为message.mentions.members.first(),同时多处调用未定义的guild、id变量
  • unban逻辑缺陷:已封禁用户不在服务器成员列表中,无法通过message.mentions.members.first()获取对象,需要从message.mentions.users中提取用户ID
  • 异步处理错误:unban是异步Promise方法,原有代码未正确调用Promise链,仅声明了未执行的匿名函数,导致catch绑定无效,进而抛出UnhandledPromiseRejectionWarning报错
  • 冗余逻辑:ban命令的then回调中重复调用的guild.members.ban(id)属于无效代码,且变量未定义

修复后实现(含Embed优化)

const { MessageEmbed } = require('discord.js');

// ban命令
module.exports = {
    name: 'ban',
    category: 'Owner',
    description: 'Bans a member.',
    aliases: [],
    usage: 'ban <user>',
    userperms: [],
    botperms: [],
    run: async (client, message, args) => {
        // 权限校验
        if (!message.member.permissions.has("BAN_MEMBERS")) {
            const errEmbed = new MessageEmbed()
                .setColor('RED')
                .setDescription('❌ 你没有封禁用户的权限!')
            return message.channel.send({ embeds: [errEmbed] });
        }
        if (!message.guild.me.permissions.has("BAN_MEMBERS")) {
            const errEmbed = new MessageEmbed()
                .setColor('RED')
                .setDescription('❌ 我没有封禁用户的权限!')
            return message.channel.send({ embeds: [errEmbed] });
        }
        // 目标用户校验
        const targetUser = message.mentions.users.first();
        if (!targetUser) {
            const errEmbed = new MessageEmbed()
                .setColor('RED')
                .setDescription('❌ 未找到指定用户,请@要封禁的目标')
            return message.channel.send({ embeds: [errEmbed] });
        }
        if (targetUser.id === message.author.id) {
            const errEmbed = new MessageEmbed()
                .setColor('RED')
                .setDescription('❌ 你不能封禁你自己')
            return message.channel.send({ embeds: [errEmbed] });
        }
        const targetMember = message.mentions.members.first();
        // 权限高于自己的用户无法封禁
        if (targetMember && targetMember.roles.highest.position >= message.member.roles.highest.position && message.guild.ownerId !== message.author.id) {
            const errEmbed = new MessageEmbed()
                .setColor('RED')
                .setDescription('❌ 你无法封禁权限高于或等于你的用户')
            return message.channel.send({ embeds: [errEmbed] });
        }
        try {
            await targetMember.ban();
            const sucEmbed = new MessageEmbed()
                .setColor('GREEN')
                .setDescription(`✅ 已成功封禁 **${targetMember.displayName}** :hammer:`)
            return message.channel.send({ embeds: [sucEmbed] });
        } catch (err) {
            const errEmbed = new MessageEmbed()
                .setColor('RED')
                .setDescription('❌ 无法封禁该用户')
            return message.channel.send({ embeds: [errEmbed] });
        }
    },
};

// unban命令
module.exports = {
    name: 'unban',
    category: 'Owner',
    description: 'Unbans a banned member.',
    aliases: [],
    usage: 'unban <user>',
    userperms: [],
    botperms: [],
    run: async (client, message, args) => {
        // 权限校验
        if (!message.member.permissions.has("BAN_MEMBERS")) {
            const errEmbed = new MessageEmbed()
                .setColor('RED')
                .setDescription('❌ 你没有解除封禁的权限!')
            return message.channel.send({ embeds: [errEmbed] });
        }
        if (!message.guild.me.permissions.has("BAN_MEMBERS")) {
            const errEmbed = new MessageEmbed()
                .setColor('RED')
                .setDescription('❌ 我没有解除封禁的权限!')
            return message.channel.send({ embeds: [errEmbed] });
        }
        // 目标用户校验(被封禁用户不在服务器成员列表,从mentions.users取)
        const targetUser = message.mentions.users.first();
        if (!targetUser) {
            const errEmbed = new MessageEmbed()
                .setColor('RED')
                .setDescription('❌ 未找到指定用户,请@要解除封禁的目标')
            return message.channel.send({ embeds: [errEmbed] });
        }
        if (targetUser.id === message.author.id) {
            const errEmbed = new MessageEmbed()
                .setColor('RED')
                .setDescription('❌ 你当前没有被封禁,无法对自己执行该操作')
            return message.channel.send({ embeds: [errEmbed] });
        }
        try {
            await message.guild.members.unban(targetUser.id);
            const sucEmbed = new MessageEmbed()
                .setColor('GREEN')
                .setDescription(`✅ 已成功解除 **${targetUser.username}** 的封禁 :hammer:`)
            return message.channel.send({ embeds: [sucEmbed] });
        } catch (err) {
            // 捕获异常直接判定为用户未被封禁
            const errEmbed = new MessageEmbed()
                .setColor('RED')
                .setDescription('❌ 该用户未处于封禁状态')
            return message.channel.send({ embeds: [errEmbed] });
        }
    },
};

优化说明

  • 改用async/await语法处理异步逻辑,配合try/catch统一捕获异常,彻底解决UnhandledPromiseRejectionWarning报错
  • 针对unban逻辑调整了用户获取方式,直接从提及用户列表取ID调用unban方法,捕获异常即可直接判断用户是否处于封禁状态
  • 所有返回消息统一使用Embed样式,用颜色区分成功/失败状态,展示效果更直观
  • 新增了角色权限高低判断,避免出现低权限用户封禁高权限用户的逻辑漏洞
  • 替换了discord.js v12+已废弃的hasPermission方法,改用新版permissions.has写法,兼容性更强

内容的提问来源于stack exchange,提问作者Hamoodi youtube

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:06:04