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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:30:57