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

Discord JS报错:Cannot read properties of undefined (reading 'roles') 求解决

问题:通过guild.members.cache.get获取成员时出现undefined报错,无法操作角色

尝试根据index值移除服务器成员的指定角色并分配新角色,通过message对象获取member时逻辑正常,但使用guild.members.cache.get(userid)获取缓存成员时触发报错,提示membe为undefined,无法读取roles属性。数据库获取用户ID数组的逻辑正常。

相关代码

const users = await verifiedUsers.find({});

const userMap = {};
users.forEach((user) => {
    userMap[user.ign] = user;
});
for (let user in userMap) {
  let userid = userMap[user].memberid
  let membe = guild.members.cache.get(userid)
  let index = userMap[user].customstats.index
  membe.roles.remove("964653007117627453");
  membe.roles.remove("964652871113142282");
  membe.roles.remove("964652446154633256");
  var role = ""
  if (index < 100) {
    role = "964653007117627453"
  }
  else if (index >= 100 && index < 200) {
      role = "964652871113142282"
  }
  else if (index >= 200 && index < 300) {
      role = "964652446154633256"
  }
  else if (index >= 400) {
      role = "964651864052334683"
  }
  membe.roles.add(role)
}

报错信息

membe.roles.remove("964653007117627453");
            ^
TypeError: Cannot read properties of undefined (reading 'roles')
    at refreshAllRanks (C:\Users\nobyp\OneDrive\Dokumente\GitHub\FDS-Bot\counters\api-count.ts:102:13)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)

原因分析

  1. 成员不在本地缓存中:guild.members.cache仅存储机器人启动后加载过的成员(如近期活跃用户、新加入用户),若目标用户长期未活跃或机器人刚启动,就不会出现在缓存里。
  2. 成员已退出服务器:数据库中存储的memberid对应用户已离开当前服务器,自然无法在成员列表中找到。
  3. 机器人权限/意图不足:未开启Server Members Intent(服务器成员意图),或缺少Manage Roles等核心权限,导致无法获取完整成员数据。
  4. 代码未处理边界值:index在300-400区间的情况未定义角色值,会导致后续add("")无效(非当前报错直接原因,但属于潜在问题)。

解决方案

1. 先判断成员是否存在,避免报错

在操作角色前添加存在性检查,不存在则跳过并记录日志:

let membe = guild.members.cache.get(userid);
if (!membe) {
    console.log(`成员ID ${userid} 不存在或未加载,跳过角色操作`);
    continue;
}

2. 主动从API获取成员(绕过缓存限制)

若缓存中无目标成员,使用异步方法从Discord API拉取数据:

let membe;
try {
    membe = await guild.members.fetch(userid); // 异步获取,需在async函数中使用
} catch (err) {
    console.log(`获取成员 ${userid} 失败: ${err.message}`);
    continue;
}

3. 配置机器人权限与意图

  • 在Discord开发者面板的"Privileged Gateway Intents"中开启Server Members Intent;
  • 在服务器设置中给机器人分配Manage Roles、View Server Insights等必要权限。

4. 补充index边界值处理

完善300-400区间的角色逻辑,避免空角色值:

else if (index >= 300 && index < 400) {
    role = "替换为该区间对应的角色ID";
}

内容的提问来源于stack exchange,提问作者NoBypass

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:10:51