Discord.js更新缓存以拉取所有具有角色的成员



当前在拉取具有特定角色的所有成员时遇到问题。我当前可以提取一个名称列表,但只能提取当前缓存的名称。如果我让我的机器人运行几个小时,它会拉更多,但它永远不会拉所有扮演该角色的成员。我读过一些关于使用.fetch((命令的不同内容,但仍然没有骰子。

const client = new Client({
intents: [
Intents.FLAGS.GUILDS,
Intents.FLAGS.GUILD_MESSAGES,
Intents.FLAGS.GUILD_VOICE_STATES,
Intents.FLAGS.GUILD_MEMBERS
]
});

msg.channel.send('exporting all members with delcared role');
msg.guild.roles.fetch('guildId');//cache roles i think?
let role = msg.guild.roles.cache.find(r => r.name === 'Sysadmins');

msg.guild.members.fetch('roleId');//cache members i think?
let list = msg.guild.roles.cache.get(roleID).members.map(m => m.nickname)
console.log(role);
console.log(list);

console.log((;按预期返回我的昵称,但只有我的,我知道至少还有10个其他人扮演这个角色。

其他类似的问题,我已经尝试过:

类似问题#1

类似问题#2

@DanLop你的回答以及@MrMythical和其他一些堆栈溢出问题帮助我解决了这个问题。我能够正确地使用异步函数来提取我需要的所有数据。

解决方案:

client.on('messageCreate', async msg => {  //TODO here });
let list = client.guilds.cache.get(tempGuildId);
try {
await list.members.fetch();
let role1 = list.roles.cache.get(roleId).members.map(m => m.displayName);
console.log(role1);
} catch (err) {
console.error(err);
}

由于您为fetch((方法提供了一个String参数,因此只有与该String匹配的用户才会被提取,更像是get((。此外,fetch((方法返回Promise,这意味着必须等待该方法才能实际接收数据。

fetch((方法应该如下所示:

await msg.guild.members.fetch();

通过这种方式,您告诉Node.js必须等到收到承诺的数据后才能继续。

它很接近,但要简单得多,有3行

await msg.guild.members.fetch() // fetch all members and cache them
const role = msg.guild.roles.cache.get("id") // get role from cache by ID (roles are always cached)
const list = role.members.map(m => m.nickname) // map members by nickname

最新更新