DiscordJS v14机器人报错求助:cache读取失败与Unknown User错误
排查建议
1. 严格区分事件边界,避免跨事件复用错误对象
你遇到的崩溃核心问题是把仅适用于messageCreate事件的逻辑,误用到了语音频道相关事件(比如voiceStateUpdate)中:
- 只有
messageCreate事件能拿到message对象,而voiceStateUpdate的参数是oldState和newState,根本不存在message,直接访问message.member或message.guild必然报错。 - 解决:把自动回复的逻辑完全限定在
messageCreate事件的回调函数内,不要让代码跑到其他事件处理流程里。
2. 给角色判断加前置存在性校验
不管用message.member还是手动fetch成员,都要先确认对象存在,防止访问undefined的属性:
// messageCreate事件内的正确写法 client.on('messageCreate', (message) => { // 排除机器人自身消息,避免循环回复 if (message.author.bot) return; // 排除DM消息(DM里没有message.member) if (!message.member) return; const targetRoleId = "641904594041045002"; if (message.member.roles.cache.has(targetRoleId)) { // 5%概率触发回复 if (Math.random() < 0.05) { message.reply('这里填自动回复内容'); } } });
3. 解决DiscordAPIError[10013]: Unknown User报错
这个错误是因为你尝试fetch的用户ID无效,或用户已不在当前服务器:
- 如果是在非
messageCreate事件里调用message.guild.members.fetch(),本质是message对象本身不存在,传入的ID自然无效,直接删除这部分跨事件的代码即可。 - 如果是在
messageCreate事件中出现,大概率是用户已退出服务器但消息仍在缓存,此时fetch会失败,加try-catch处理:
client.on('messageCreate', async (message) => { if (message.author.bot || !message.guild) return; const targetRoleId = "641904594041045002"; let member; try { member = await message.guild.members.fetch(message.author.id); } catch (err) { // 用户不在服务器,直接终止逻辑 return; } if (member.roles.cache.has(targetRoleId) && Math.random() < 0.05) { message.reply('这里填自动回复内容'); } });
4. 检查机器人权限与Intent配置
- 在Discord开发者门户的Bot页面,确保开启
GUILD_MEMBERS权限。 - 若使用DiscordJS v14+,客户端初始化时必须启用对应Intent,否则无法获取成员信息:
const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent, GatewayIntentBits.GuildMembers, // 必须开启才能读取成员角色 GatewayIntentBits.GuildVoiceStates // 处理语音事件时需要 ] });
5. 全局捕获错误防止机器人崩溃
添加全局错误监听,避免单个事件报错导致整个服务挂掉:
client.on('error', (err) => { console.error('客户端错误:', err); }); client.on('warn', (warn) => { console.warn('客户端警告:', warn); }); process.on('unhandledRejection', (reason) => { console.error('未处理的Promise错误:', reason); });
内容的提问来源于stack exchange,提问作者PestFromTheWest
相关产品推荐
相关产品推荐

