discord.js v13开发Discord机器人解封功能时fetchBans报错如何解决
问题原因
- 首次报错
Cannot read properties of undefined (reading 'fetchBans'):message.guild对象没有cache子属性,访问不存在的属性得到undefined,调用方法直接触发空指针错误。 - 二次报错
TypeError: message.guild.fetchBans is not a function:discord.js v13做了API破坏性调整,旧版本v12的guild.fetchBans()方法已被移除,所有封禁相关操作都迁移到guild.bans管理器下。
解决方案
- 替换获取服务器封禁列表的代码,将原报错行修改为:
message.guild.bans.fetch().then(async bans => {
- 检查机器人初始化的Intents配置,必须启用
GUILDS权限,否则无法正常获取服务器对象相关数据,初始化示例:
const { Client, Intents } = require('discord.js'); const client = new Client({ intents: [ Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, // 其他业务需要的Intents ] });
- 建议在命令逻辑最前端增加场景判断,避免私信触发命令时报错:
if (!message.inGuild()) return message.channel.send('该命令仅支持在服务器内使用');
修改后核心代码示例:
// 开头先加场景判断 if (!message.inGuild()) return message.channel.send('该命令仅支持在服务器内使用'); message.guild.bans.fetch().then(async bans => { if (bans.size === 0) return message.channel.send("No one is banned on the server!") let bannedUser = bans.find(ban => ban.user.id == userID) if (!bannedUser) return message.channel.send("This user isn't banned!") await message.guild.members.unban(bannedUser.user, reason).catch(err => { return message.channel.send("Something went wrong!") }).then(() => { let embed = new MessageEmbed() .setColor("GREEN") .setTitle(`Member unbanned!`) .setDescription("") .setTimestamp() .setFooter(this.client.user.username) embed.addField(`member = ${target.username}`, `reason = ${reason}`, false) message.channel.send({embeds: [embed]}); if (row[0].logs_channel != null) this.client.channels.cache.get(row[0].logs_channel).send({embeds: [embed]}) message.delete() }) })
内容的提问来源于stack exchange,提问作者Timmie282
相关产品推荐
相关产品推荐

