discord.js报错Cannot read property 'roles' of undefined如何解决?
报错成因
你遇到的TypeError: Cannot read property 'roles' of undefined报错,直接原因是client.guilds.cache.get(servers[index])执行后返回了undefined,你尝试读取undefined的roles属性导致类型错误,具体触发原因有以下几点:
- 你填写在
servers数组中的服务器ID有误,或是你的Discord机器人并未加入对应ID的服务器,导致客户端缓存中不存在对应服务器对象,查询返回空值 - 代码存在语法结构错误:
changeColor函数的闭合大括号位置错误,for循环结束后多写了一个闭合大括号,导致place变量的更新逻辑被移出了函数作用域 - 没有做非空校验:你没有判断
server变量是否存在就直接读取其属性,只要有一个服务器ID匹配失败就会直接触发崩溃 - 额外隐含问题:代码中用到的
rainbow色值数组、size变量均未定义,权限判断逻辑为空没有实际作用,setColor的错误捕获逻辑也没有写全,后续运行还会触发其他报错。
修复后的参考代码
const rainPerms = [ "MANAGE_ROLES", "ADMINISTRATOR" ]; // 补全缺失的彩虹色值数组,可自行替换颜色 const rainbow = ["#FF0000", "#FF7F00", "#FFFF00", "#00FF00", "#00FFFF", "#0000FF", "#8B00FF"]; const size = rainbow.length; let place = 0; // 请替换为实际的服务器ID,确认机器人已加入这些服务器 const servers = ["111111111111111111", "222222222222222222"]; function changeColor() { for (let index = 0; index < servers.length; ++index) { const server = client.guilds.cache.get(servers[index]); // 增加非空判断,服务器不存在就跳过 if (!server) continue; // 校验机器人是否有管理角色权限 if (!server.members.me.permissions.has(rainPerms)) continue; const role = server.roles.cache.find(r => r.name === 'Rainbow'); // 角色不存在就跳过 if (!role) continue; role.setColor(rainbow[place]).catch(err => console.log(`角色变色失败: ${err}`)); } // 修正位置,把place更新逻辑放回函数内 if (place == (size - 1)) { place = 0; } else { place++; } } client.on('ready', () => { console.log(`已登录为 ${client.user.tag}`); setInterval(changeColor, 60000); changeColor(); });
内容的提问来源于stack exchange,提问作者Grimm
相关产品推荐
相关产品推荐

