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

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)没有获取到对应服务器成员对象,常见原因和解决方式如下:

  1. 成员不在本地缓存中
    Discord.js 默认不会缓存服务器内所有成员(尤其是大型服务器),仅缓存机器人启动后活跃过的成员。直接从cache中获取大概率会找不到目标成员,应改用异步的fetch方法获取,记得加上await:
member = await guild.members.fetch(user);
  1. 用户ID无效或已退出服务器
    检查数据库中user_discord_id是否为有效的Discord用户ID,同时确认该用户是否仍在目标服务器内。如果用户已退出,自然无法获取成员对象,建议在代码中增加判断逻辑避免报错:
if (!member) {
    console.log(`未找到用户 ${user},跳过角色移除`);
    continue;
}
  1. 补充:权限与角色位置检查
    虽然不是本次报错的直接原因,但后续移除角色时可能遇到权限问题:机器人需要拥有「管理角色」权限,且机器人的角色位置必须高于要移除的角色,否则操作会失败。

修改后的完整代码示例:

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._

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:36:00