Discord.js查询指定角色成员输出Embed功能及代码不生效问题排查
问题排查与修复方案
现有代码的核心问题
- 事件名适配错误:Discord.js v13及以上版本废弃了
message事件,替换为messageCreate事件,使用旧事件名不会触发命令逻辑。 - 集合取值逻辑错误:v12及以上版本所有管理器数据都存放在
cache集合中,直接调用roles.get()无法获取到角色,需要改为roles.cache.get(),成员列表取值同理需要加.cache。 - 缺少基础边界判断:没有过滤机器人自身发送的消息,没有判断消息是否来自服务器频道(私信场景下
message.guild为null会直接报错),也没有处理角色不存在的异常情况。 - 需求实现不完整:原代码仅输出了用户tag,没有按需求同步输出用户ID。
- 嵌入发送方式适配错误:Discord.js v14及以上版本发送嵌入不能直接传Embed实例,需要放在
embeds数组参数中。 - 缺少权限校验前置逻辑:机器人需要持有
服务器角色查看、频道发消息权限才能正常拉取角色成员列表、发送返回消息。
修复后的通用代码(兼容v13/v14版本)
// 监听消息创建事件(v13+ 统一使用messageCreate) client.on("messageCreate", async message => { // 过滤机器人消息、非服务器场景的消息 if (message.author.bot || !message.guild) return; // 匹配命令 if (message.content.trim() !== "!listroletest") return; try { // 从缓存中获取目标角色,可替换为自己的角色ID const testRole = message.guild.roles.cache.get('901592912171765850'); if (!testRole) { return message.channel.send('未找到对应的test角色,请检查角色ID是否正确'); } // 拼接用户tag+ID的列表内容,无成员时显示兜底提示 const userList = testRole.members.cache.map(m => `${m.user.tag} | ID: ${m.user.id}`).join('\n') || '暂无用户持有该角色'; // 构造Embed消息 const ListEmbed = new Discord.MessageEmbed() .setTitle('持有test角色的用户列表:') .setDescription(userList); // v14版本发送嵌入需要放在embeds数组中,v13可直接写message.channel.send(ListEmbed) await message.channel.send({ embeds: [ListEmbed] }); } catch (err) { console.error('命令执行错误:', err); message.channel.send('执行命令时发生错误,请检查机器人权限是否配置正常'); } });
内容的提问来源于stack exchange,提问作者Supreme
相关产品推荐
相关产品推荐

