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
可以读取,值为5topMemberList
是一个数组,包含字符串格式的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
,而不是GuildMember
或Role
对象。这是因为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()
语句,它应该能够向您显示代码这一部分中的任何其他错误(如果上述修复不足以使代码正常工作(。