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)
原因分析
- 成员不在本地缓存中:
guild.members.cache仅存储机器人启动后加载过的成员(如近期活跃用户、新加入用户),若目标用户长期未活跃或机器人刚启动,就不会出现在缓存里。 - 成员已退出服务器:数据库中存储的
memberid对应用户已离开当前服务器,自然无法在成员列表中找到。 - 机器人权限/意图不足:未开启
Server Members Intent(服务器成员意图),或缺少Manage Roles等核心权限,导致无法获取完整成员数据。 - 代码未处理边界值:
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
相关产品推荐
相关产品推荐

