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'或直接判断!roleguild.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("操作失败,请确认机器人拥有「管理身份组」权限且身份组排序高于要分配的身份组"); } }
主要修改点:
- 将身份组查找的数据源从错误的
sender.guild改为guild(即message.guild,当前服务器实例) - 给方法添加
async标识,用await处理身份组创建、身份组添加的异步操作,确保操作完成再执行后续逻辑 - 修正身份组存在性的判断逻辑,统一用
targetRole变量存储身份组实例,解决块级作用域访问问题 - 补充异常捕获和空值判断,提升代码健壮性,出现权限问题时可快速定位原因
内容的提问来源于stack exchange,提问作者Azmodeus
相关产品推荐
相关产品推荐

