【问题标题】:discord.js Cannot read property add of undefined when trying to give rolediscord.js 尝试赋予角色时无法读取未定义的属性添加
【发布时间】:2021-04-07 01:24:10
【问题描述】:
for (let l = 0; l < client.config.topMemberCount; l++) {
if (topMemberList[l] === null) continue;
if (String(topMemberList[l]) === '261292565247252480') continue;
let roleMember = message.guild.members.fetch(topMemberList[l]);
console.log(roleMember);
let roleToGive = message.guild.roles.fetch('791984048851124234');
roleMember.roles.add(roleToGive);
}
好的,那么:
-
client.config.topMemberCount可以读取,值为5
-
topMemberList 是一个数组,其中包含 5 个用户的 ID,采用字符串格式(例如:`223212312432123')
- 当我运行它时,它返回
TypeError: Cannot read property 'add' of undefined,这很奇怪,因为如果我将 roleMember 和 roleToGive 输出到控制台,它显然会输出目标角色或成员的雪花。
-
if (topMemberList[l] === null) continue; 和 if (String(topMemberList[l]) === '261292565247252480') continue; 只是一些不将角色赋予我自己或 null 对象的措施,如果数组在某些时候包含 null。
我做错了什么? :(
编辑: discord.js 版本为 12.5.1
【问题讨论】:
标签:
node.js
npm
discord.js
【解决方案1】:
.fetch() 方法是异步的,它返回一个Promise,而不是GuildMember 或Role 对象。这是因为 DJS 会花费一些时间来获取这些值,并且您只需要在真正获取后才使用获取的成员/角色(当前您正在尝试在它们真正被获取之前使用这些值,这这就是错误告诉您roleMember.roles 未定义的原因)。在 discord.js 文档中查看 example 中的 .fetch() 以亲自查看。
解决方案是使用async/await,或使用.then()。我将在下面演示后者,因为未提供您的 function 声明(不用说,您只需在 function 和 await 之前添加 async 在您的 .fetch() 行之前)。
for (let l = 0; l < client.config.topMemberCount; l++) {
if (topMemberList[l] === null) continue;
if (String(topMemberList[l]) === '261292565247252480') continue;
message.guild.members.fetch(topMemberList[l]).then(roleMember => {
message.guild.roles.fetch('791984048851124234').then(roleToGive => {
roleMember.roles.add(roleToGive);
}).catch(err => console.log("Role could not be found; Error: " + err.stack));
}).catch(err => console.log("Member could not be found; Error: " + err.stack));
}
我还添加了.catch() 语句,它应该能够向您显示这部分代码中的任何其他错误(如果上述修复不足以使您的代码正常工作)。