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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:57:04