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

discord.js报错:Cannot read property 'roles' of undefined 跨服赋角色问题

问题原因与修复方法

直接报错的核心原因

你写的let memberRole = server.guild.roles.get("role ID")存在两个语法错误:

  • client.guilds.cache.get('guild ID')返回的server本身就是Guild对象,不需要额外拼接.guild,访问不存在的server.guild属性后再调用.roles自然会报未定义
  • discord.js v12及以上版本,所有资源查询都需要走.cache集合,roles.get要改为roles.cache.get

其他隐藏问题

  1. 成员对象定义错误
    你当前的rMember定义逻辑错误,赋值的第一行是guild.roles.cache,后续的或运算不会生效,拿到的不是成员对象,后续加角色操作也会报错。
  2. 跨服加角色逻辑错误
    你不能直接给当前服务器的成员添加另一个服务器的角色,必须先在目标服务器查询到该用户的成员实例,再调用对应方法加角色。
  3. Intent配置错误
    Intents.GUILD_ROLES写法错误,需要补全.FLAGS,同时你需要额外开启GUILD_MEMBERS intent,且要在Discord开发者后台的机器人设置页开启「服务器成员权限」开关,否则跨服无法获取成员数据。

修正后的代码

// 首先修正顶部client初始化的intent配置
const client = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_MEMBERS, Intents.FLAGS.GUILD_ROLES] });
    
module.exports = {
    name: 'accept',
    description: 'Adds A Player To The Whitelist',
    permissions: `ADMINISTRATOR`,
    execute(message, args) { // 你之前的参数很多是多余的,不需要定义
        message.delete()
        // 修正rMember的获取逻辑
        let rMember = message.mentions.members.first() || 
        message.guild.members.cache.find((m) => m.user.tag === args[0]) ||
        null;
        if(!rMember) return message.channel.send('未找到对应用户')
        // 替换成你实际的roleID
        let role1 = message.guild.roles.cache.find((r) => r.id == '你的第一个角色ID')
        let role2 = message.guild.roles.cache.find((r) => r.id == '你的第二个角色ID')
        // 替换成你要同步的目标服务器ID
        let targetServer = client.guilds.cache.get('目标服务器ID')
        if(!targetServer) return console.log('未找到目标服务器')
        // 替换成目标服务器的对应角色ID
        let memberRole = targetServer.roles.cache.get("872432775330955264");
        if(!memberRole) return console.log('未找到目标角色')
        // 先给当前服务器的用户加角色
        rMember.roles.add([role1, role2]).catch((e) => console.log(e));
        // 到目标服务器查询该用户的成员实例,再加角色
        targetServer.members.fetch(rMember.user.id).then(targetMember => {
            targetMember.roles.add(memberRole).catch((e) => console.log(e));
        }).catch(e => {
            console.log('该用户不在目标服务器内',e)
        })
        rMember.send(`消息内容`);
        message.channel.send('操作完成')
}};

额外注意事项

  • 你的机器人需要同时在两个服务器内,且拥有「管理角色」权限,角色的位置要高于你要分配的角色
  • 所有ID都要替换成你自己的实际ID,不要保留示例占位内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:36:04