You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用discord.js查询用户角色,删角色后仍显示的原因及解决

问题描述

我使用Discord机器人通过以下代码查询用户角色:

const member = await guild.members.fetch(user_id)

console.log(member._roles)

角色能正常输出,但在Discord中删除其中一个角色后,再次查询机器人仍显示相同的角色列表,未识别到角色减少。

使用roles.cache.some方法也出现同样问题(即使在Discord中已删除角色,机器人仍输出"user has role already"):

if (member.roles.cache.some(role => role.name === 'verify-test-role')) {
  console.log("user has role already")
}

重启机器人后,角色显示恢复正常。请问这是什么原因?如何让机器人持续追踪角色变更?

原因分析与解决方案

原因

问题出在Discord.js的缓存机制上:

  • 第一次调用guild.members.fetch(user_id)时,机器人会把该成员的信息缓存到本地,后续查询如果不主动刷新,会直接读取缓存里的旧数据,不会同步Discord服务器的最新角色变更。
  • roles.cache本身就是本地缓存的角色集合,自然也不会自动更新。

解决办法

1. 强制拉取最新成员数据

每次查询时,给fetch方法添加force: true参数,跳过本地缓存,直接从Discord服务器获取最新数据:

const member = await guild.members.fetch({ user: user_id, force: true })

console.log(member.roles.cache.map(role => role.id))

注意:别直接用_roles,这是Discord.js的私有内部属性,版本更新可能会失效,用member.roles.cache相关方法更稳妥。

2. 监听角色变更事件实现自动追踪

如果需要实时感知所有成员的角色变化,不需要手动刷新缓存,可以监听Discord.js提供的专属事件:

// 监听角色被移除的事件
client.on('guildMemberRoleRemove', (member, role) => {
  console.log(`成员 ${member.user.tag} 被移除了角色:${role.name}`)
  // 这里可以同步本地缓存或执行后续业务逻辑
})

// 监听角色被添加的事件
client.on('guildMemberRoleAdd', (member, role) => {
  console.log(`成员 ${member.user.tag} 被添加了角色:${role.name}`)
})

// 监听成员信息更新(包含角色变更),对比新旧角色状态
client.on('guildMemberUpdate', (oldMember, newMember) => {
  const removedRoles = oldMember.roles.cache.filter(role => !newMember.roles.cache.has(role.id))
  const addedRoles = newMember.roles.cache.filter(role => !oldMember.roles.cache.has(role.id))
  
  if (removedRoles.size) {
    console.log(`${newMember.user.tag} 移除的角色:${removedRoles.map(r => r.name).join(', ')}`)
  }
  if (addedRoles.size) {
    console.log(`${newMember.user.tag} 添加的角色:${addedRoles.map(r => r.name).join(', ')}`)
  }
})

通过这些事件,机器人能实时捕捉角色变更,自动同步最新状态,不用每次手动刷新。

额外提示

确保机器人拥有GuildMembers相关权限,否则无法正常获取成员信息和监听事件。

内容的提问来源于stack exchange,提问作者Juno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 05:24:08