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

Discord.js机器人如何检测用户是否持有指定角色及报错排查

问题原因
  1. 错误读取服务器对象:message.author 是 Discord 全局用户对象,不存在 guild 属性,访问 message.author.guild 会返回 undefined,后续读取 roles 属性就触发了「Cannot read property 'roles' of undefined」报错。服务器对象需要从 message.guild 读取。
  2. 模板字符串语法错误:调用 db.get 时使用双引号包裹字符串,内部的 ${message.guild.id} 不会被解析为变量,实际查询的是固定字面量 modrole_${message.guild.id},无法正确读取对应服务器存储的角色ID,需要将双引号替换为反引号。
  3. 角色判断方法传参错误:GuildMemberRoleManager.cache.has() 方法接收的参数是角色ID字符串,你传入的是 find 方法返回的角色对象,即使前面逻辑修复也会匹配失败。
修复方案

如果你只需要判断用户是否持有指定角色,不需要获取完整角色对象,可以直接简化代码,避免多余查询:

// 正确解析模板字符串,读取对应服务器存储的管理员角色ID
const modRoleId = db.get(`modrole_${message.guild.id}`);
// 直接用角色ID判断成员是否持有对应角色
if (modRoleId && message.member.roles.cache.has(modRoleId)) {
  message.reply("Member With Role!");
}

如果确实需要获取完整角色对象做后续逻辑处理,可使用如下写法:

const modRoleId = db.get(`modrole_${message.guild.id}`);
// 从服务器对象中读取角色列表,匹配目标角色
const modRole = message.guild.roles.cache.find(role => role.id === modRoleId);
// 先判断角色是否存在(避免服务器删除角色后触发报错),再判断成员是否持有角色
if (modRole && message.member.roles.cache.has(modRole.id)) {
  message.reply("Member With Role!");
}
额外注意事项
  • 确保你的机器人开启了 GUILDS、GUILD_MEMBERS 网关意图,否则可能无法正常获取服务器角色、成员角色缓存。
  • 建议提前判断 message.guild 是否存在,避免在私人频道(DM)触发指令时出现报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:15:04