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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:45:06