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

Discord.js运行报错Cannot read property 'roles' of undefined求助

报错原因
  • 直接触发报错的根因:message.author返回的是全局User对象,不存在guild属性,代码中sender.guild.roles.cache调用时sender.guild为undefined,读取undefined的roles属性就抛出了对应TypeError: Cannot read property 'roles' of undefined错误。
  • 代码还存在多处附加逻辑错误:
    • typeof运算符返回值为字符串,typeof role === undefined的判断永远不成立,正确写法应为typeof role === 'undefined'或直接判断!role
    • guild.roles.create是异步方法,返回Promise对象,直接将newRole传入roles.add方法会传入Promise而非实际生成的身份组对象,导致操作失败
    • newRole是if代码块内的块级作用域变量,else分支无法访问该变量,会抛出未定义错误
修复方案

修复核心是修正身份组的查找数据源,同时处理异步逻辑、作用域问题,修复后代码如下:

exports.run = async (client, message, args) => {
  // 补充空值判断,避免未提及成员时报错
  if (!message.mentions.members?.size) return message.channel.send("请先@要添加到派对的用户");
  const member = message.mentions.members.first();
  const guild = message.guild;
  const roleName = `${message.author.username}'s party`;
  // 从服务器对象查找身份组,替代错误的sender.guild调用
  let targetRole = guild.roles.cache.find(role => role.name === roleName);

  try {
    if (!targetRole) {
      // 等待身份组创建完成再执行后续操作
      targetRole = await guild.roles.create({
        data: {
          name: roleName,
          color: 'BLUE',
        },
        reason: 'Partee',
      });
      console.log(`身份组创建成功:${roleName}`);
      await member.roles.add(targetRole);
      message.channel.send("Your party has been created!");
    } else {
      await member.roles.add(targetRole);
      message.channel.send("You have been added to your party!");
    }
  } catch (error) {
    console.error('操作执行失败:', error);
    message.channel.send("操作失败,请确认机器人拥有「管理身份组」权限且身份组排序高于要分配的身份组");
  }
}

主要修改点:

  1. 将身份组查找的数据源从错误的sender.guild改为guild(即message.guild,当前服务器实例)
  2. 给方法添加async标识,用await处理身份组创建、身份组添加的异步操作,确保操作完成再执行后续逻辑
  3. 修正身份组存在性的判断逻辑,统一用targetRole变量存储身份组实例,解决块级作用域访问问题
  4. 补充异常捕获和空值判断,提升代码健壮性,出现权限问题时可快速定位原因

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 06:48:03