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

离开服务器后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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:03:51