discord.js在尝试赋予角色时无法读取未定义的属性add


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输出到控制台,它显然会输出目标角色或成员的Snowflake
  • if (topMemberList[l] === null) continue;if (String(topMemberList[l]) === '261292565247252480') continue;只是一些措施,如果数组在某个时刻包含null,则不将角色赋予我自己或null对象

我做错了什么?:(


编辑:discord.js在12.5.1版上

方法.fetch()是异步的,返回一个Promise,而不是GuildMemberRole对象。这是因为DJS获取这些值需要一点时间,并且您只需要在真正获取已获取的成员/角色后才使用它(目前,您正试图在真正获取这些值之前使用这些值,这就是为什么错误会告诉您roleMember.roles未定义(。在discord.js文档中查看.fetch()的任何示例。

解决方案是使用async/await,或者使用.then()。我将在下面演示后者,因为没有提供您的function声明(不用说,您只需要在function之前添加async,在.fetch()行之前添加await(。

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()语句,它应该能够向您显示代码这一部分中的任何其他错误(如果上述修复不足以使代码正常工作(。

最新更新