如何修复DiscordAPIError 10007 unknown member错误
修复DiscordAPIError 10007 (Unknown Member)错误
错误原因
这个错误意味着你尝试获取的成员不存在于当前服务器中,可能是用户已退出服务器、机器人缓存中无该用户数据,或是传入的用户ID无效。
具体修复方案
1. 添加成员存在性检查
在获取成员后先判断是否存在,避免后续代码报错:
// 替换原有的成员获取代码 const member = await interaction.guild.members.fetch(user.id).catch(err => null); if (!member) { const notFoundEmbed = new EmbedBuilder() .setTitle("**Mibow so cutest**") .setDescription(`无法找到用户 \`${user.username}\`,该用户可能已退出服务器。`) .setColor(0xf44336) .setTimestamp(); return interaction.reply({ embeds: [notFoundEmbed], ephemeral: true }); }
2. 直接使用用户ID封禁(可选)
如果你的核心需求是封禁用户,无需依赖成员对象检查角色层级(若需要检查则仍需先确认成员存在),可以直接调用服务器的封禁方法,即使用户已退服也能完成封禁:
// 替换原有的member.ban代码 try { await interaction.guild.ban(user.id, { reason }); // 可在此添加成功提示 } catch (err) { const banErrEmbed = new EmbedBuilder() .setTitle("**Mibow so cutest**") .setDescription(`封禁 \`${user.username}\` 失敗,請檢查機器人權限。`) .setColor(0xf44336) .setTimestamp(); return interaction.reply({ embeds: [banErrEmbed], ephemeral: true }); }
3. 验证机器人权限
确保机器人拥有Ban Members权限,且机器人角色的位置高于目标用户的角色(若目标用户仍在服务器中)。
修复后的完整代码
async execute(interaction) { const { options } = interaction; const user = options.getUser("target"); const reason = options.getString("reason") || `\`ไม่ได้กรอกเหตุผล\``; // 尝试获取成员,捕获不存在的情况 const member = await interaction.guild.members.fetch(user.id).catch(err => null); // 检查成员是否存在 if (!member) { const notFoundEmbed = new EmbedBuilder() .setTitle("**Mibow so cutest**") .setDescription(`无法找到用户 \`${user.username}\`,该用户可能已退出服务器。`) .setColor(0xf44336) .setTimestamp(); return interaction.reply({ embeds: [notFoundEmbed], ephemeral: true }); } const errEmbed = new EmbedBuilder() .setTitle("**Mibow so cutest**") .setDescription(`คุณไม่สามารถใช้คำสั่งนี้กับ \`${user.username}\` ยศอาจจะสูงกว่าหรือเท่ากับตัวคุณ.`) .setColor(0xf44336) .setTimestamp(); if (member.roles.highest.position >= interaction.member.roles.highest.position) return interaction.reply({ embeds: [errEmbed], ephemeral: true }); // 执行封禁并处理可能的错误 try { await member.ban({ reason }); const successEmbed = new EmbedBuilder() .setTitle("**Mibow so cutest**") .setDescription(`已成功封禁 \`${user.username}\`\nเหตุผล: ${reason}`) .setColor(0x4caf50) .setTimestamp(); return interaction.reply({ embeds: [successEmbed], ephemeral: true }); } catch (err) { const banErrEmbed = new EmbedBuilder() .setTitle("**Mibow so cutest**") .setDescription(`封禁 \`${user.username}\` 失敗,請檢查機器人權限。`) .setColor(0xf44336) .setTimestamp(); return interaction.reply({ embeds: [banErrEmbed], ephemeral: true }); } }
内容的提问来源于stack exchange,提问作者Xasperz
相关产品推荐
相关产品推荐

