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
相关产品推荐
相关产品推荐

