discord.js移除玩家角色报错:Cannot read properties of undefined (reading 'roles')
问题:Discord机器人移除角色时报错TypeError: Cannot read properties of undefined (reading 'roles')
我有一个玩家数据表,当玩家的is_deleted字段值为1时,需要为该玩家移除对应角色,但运行代码时出现以下错误:
member.roles.remove(role); ^ TypeError: Cannot read properties of undefined (reading 'roles')
相关代码:
conec.query("SELECT players.user_discord_id, teams.discord_group_id FROM players RIGHT JOIN teams ON players.team_id=teams.id WHERE players.is_deleted=1", async function (err, result, fields) { if (err) throw err; for (const item of result) { user = item.user_discord_id; role = item.discord_group_id; guild = client.guilds.cache.get(targetGuild); member = guild.members.cache.get(user); member.roles.remove(role); console.log("removed role " + role + " from " + user); } })
错误原因及解决办法
这个错误的核心是member变量为undefined,也就是通过guild.members.cache.get(user)没有获取到对应服务器成员对象,常见原因和解决方式如下:
- 成员不在本地缓存中
Discord.js 默认不会缓存服务器内所有成员(尤其是大型服务器),仅缓存机器人启动后活跃过的成员。直接从cache中获取大概率会找不到目标成员,应改用异步的fetch方法获取,记得加上await:
member = await guild.members.fetch(user);
- 用户ID无效或已退出服务器
检查数据库中user_discord_id是否为有效的Discord用户ID,同时确认该用户是否仍在目标服务器内。如果用户已退出,自然无法获取成员对象,建议在代码中增加判断逻辑避免报错:
if (!member) { console.log(`未找到用户 ${user},跳过角色移除`); continue; }
- 补充:权限与角色位置检查
虽然不是本次报错的直接原因,但后续移除角色时可能遇到权限问题:机器人需要拥有「管理角色」权限,且机器人的角色位置必须高于要移除的角色,否则操作会失败。
修改后的完整代码示例:
conec.query("SELECT players.user_discord_id, teams.discord_group_id FROM players RIGHT JOIN teams ON players.team_id=teams.id WHERE players.is_deleted=1", async function (err, result, fields) { if (err) throw err; for (const item of result) { const user = item.user_discord_id; const role = item.discord_group_id; const guild = client.guilds.cache.get(targetGuild); if (!guild) { console.log(`未找到目标服务器 ${targetGuild}`); continue; } let member; try { member = await guild.members.fetch(user); } catch (fetchErr) { console.log(`获取用户 ${user} 失败:${fetchErr.message}`); continue; } if (!member) { console.log(`用户 ${user} 不在服务器中`); continue; } try { await member.roles.remove(role); console.log(`已移除用户 ${user} 的角色 ${role}`); } catch (removeErr) { console.log(`移除角色失败:${removeErr.message}`); } } })
内容的提问来源于stack exchange,提问作者Matze._
相关产品推荐
相关产品推荐

