所以我为我的discord机器人制作了一个黑名单功能,你基本上只需要放一个词和一个角色,如果有人扮演这个角色,那么。。。会发生什么事吗?还不是很确定。但当我尝试迭代成员的角色时,我会得到以下错误:
(node:21803) UnhandledPromiseRejectionWarning: TypeError: message.member.roles is not iterable
这是我的代码:
for (const word of message.content.split(" ")) {
for (const role of message.member.roles) {
console.log(role.name);
}
}
关于如何解决这个问题有什么想法吗?
我不太明白你指的是什么角色,但我想你说的是帮会角色。你可以从消息中获取公会,然后它是RoleManager,所以你可以映射它的缓存来获取里面的所有角色。这就是你的做法:
const roles = message.guild.roles.cache.map(role => role);
与Javascript中的任何其他数组一样,您可以使用forEach循环对其进行迭代。
// This log every role in the Guild the message was sent
roles.forEach(role => {
console.log(role);
});
对于提到的用户,您可以通过MessageMentions对象获得它。比如:
// In case you want the User Object
const user = message.mentions.users.first();
// In case you want the GuildMember object (most likely)
const member = message.mentions.members.first();
有了这些,我认为你可以用你想要达到的东西来工作。不管怎样,如果你谈论的是消息中提到的角色,你可以像用户一样(从MessageMentions对象(获得它。
const role = message.mentions.roles.first();
正如您所说,您不确定要做什么,但如果它像">将用户分配到角色"命令,您可以这样做:
const member = message.mentions.members.first();
const role = message.mentions.roles.first();
member.roles.add(role);
// !command @user @role - adds the user to the role
或者,如果一直以来,您只是在尝试迭代成员的角色。它的工作原理或多或少与第一个示例相似。好了:
// In case you want the mentioned user
const member = message.mentions.members.first();
// In case you want the message author user
const member = message.member;
// Map the User Roles
const roles = member.roles.cache.map(role => role);
// Iterate though it =)
roles.forEach(role => {
console.log(role);
});
有用的链接:
消息#guild|discord.js
guild#roles|discord.js
角色管理器#cache|discordjs
如果使用v12+
,则必须通过cache
属性传递GuildMemberRoleManager
for (const role of message.member.roles.cache) {
// ...