Discord.js unban命令报错Unban is not defined问题咨询
错误原因分析
- 被封禁的用户已经不属于服务器成员,不会存在于
message.guild.members.cache中,你代码中获取的targed变量实际为undefined,调用不存在的unban方法自然抛出类型错误 - Discord.js没有提供成员对象的
unban方法,解封功能需要通过服务器的封禁管理接口实现 - 现有代码存在多处逻辑错位:命令是解封功能,但描述、私信通知内容都是封禁相关的错误内容,且被封禁用户无法直接通过服务器成员对象发送私信
修复方案
以下是适配Discord.js v13+版本的完整修正代码:
const Discord = require('discord.js'); module.exports = { name: 'unban', aliases: ['uban'], category: 'misc', permissions: ['BAN_MEMBERS'], description: '使用该命令解封服务器内的被封禁用户', /** * @param {Discord.Message} message * @param {Array} args */ async execute(message, args) { if (message.mentions.users.size === 0) return message.reply('请@要解封的用户 ❌'); const targetUser = message.mentions.users.first(); const targetid = targetUser.id; if (targetid === message.client.user.id) return message.reply("我?你没事吧?操作失败 🤡"); // 先校验用户是否真的在封禁列表中 const banList = await message.guild.bans.fetch(); const isBanned = banList.has(targetid); if (!isBanned) return message.reply('该用户没有被封禁 ❌'); let reason = args.length >= 2 ? args.slice(1).join(' ') : '未提供原因'; let extra = ''; setTimeout(async () => { try { // 调用正确的解封接口 await message.guild.members.unban(targetid, reason); const embed = new Discord.MessageEmbed() .setTitle('用户已解封') .setDescription( `${targetUser.tag} 已成功从 **${message.guild.name}** 解封 ✅ \n解封原因:**${reason}\n${extra}**` ) .setColor('#FA2657'); message.channel.send(embed); } catch (error) { message.channel.send( `无法解封指定用户,请确认机器人权限高于封禁管理权限,且操作合法 ❌` ); } }, 2000); }, };
关键修改说明
- 移除了错误的成员对象获取逻辑,直接通过用户ID调用服务器解封接口
- 增加了封禁状态校验,避免对未封禁用户执行操作
- 删除了无法执行的给被封禁用户发私信的逻辑,如果你需要通知用户,可以在解封后再尝试发送,或让用户通过申诉渠道主动入群
- 修正了命令描述、参数处理等逻辑错误
- 调整了错误捕获范围,确保异常可以被正确捕获提示
内容的提问来源于stack exchange,提问作者JoonyWoony
相关产品推荐
相关产品推荐

