离开服务器后roleDelete事件报错,添加Promise.catch仍未解决
解决Discord.js机器人处理已离开服务器事件的报错问题
这个问题的核心原因是:你的机器人离开服务器后,Discord的事件推送可能存在延迟,导致机器人仍然收到了该服务器的roleDelete事件。这时候你尝试访问该服务器的频道并发送消息,自然会因为**缺少权限(Missing Access)**而报错。
要让机器人完全忽略已离开服务器的事件,你只需要在处理逻辑的最开始,先检查当前机器人是否还在这个服务器里就行。具体来说,可以通过client.guilds.has(guildID)来判断——client.guilds集合里只保存机器人当前加入的服务器,离开后对应的ID会被移除。
修改你的roleDelete.js代码,加入这个检查:
'use strict'; const Discord = require('discord.js'); const Error = require('debug')('Event:roleDelete:Error'); /** * @param {object} client - The client instance * @param {object} role - The deleted role object */ module.exports.run = (client, role) => { const guildID = role.guild.id; // 新增检查:如果机器人已经不在这个服务器,直接返回不处理 if (!client.guilds.has(guildID)) return; let embed = new Discord.RichEmbed(); const guildName = role.guild.name; const guildIcon = role.guild.iconURL; const modLog = client.guilds.get(guildID).channels.find('name', client.config.modLog); const tempIcon = 'https://images-ext-2.discordapp.net/external/ouGhEoGzz1ZyBG9mMFrYClvdv9V0FZ0jGSEHa_kLLYk/https/discordapp.com/assets/0e291f67c9274a1abdddeb3fd919cbaa.png'; if (!modLog) return; embed = new Discord.RichEmbed() .setAuthor(guildName, guildIcon ? guildIcon : tempIcon) .addField('Role Name', role.name, true) .addField('Role Color', role.hexColor, true) .addField('Role Hoisted', role.hoist, true) .setFooter('Role Deleted At') .setTimestamp() .setColor(client.config.colors.red); return modLog.send(embed).catch(err => Error(err)); };
另外,你提到的guildMemberRemove事件报错也可以用同样的方法解决——在处理该事件的代码开头,先检查对应服务器是否还在client.guilds集合中,不在就直接返回。
这样就能确保机器人只处理当前加入服务器的事件,彻底避免因已离开服务器的事件触发权限报错。
内容的提问来源于stack exchange,提问作者Etosticity
相关产品推荐
相关产品推荐

