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

discord.js v13.6获取指定角色用户报BITFIELD_INVALID错误排查

错误根因定位

抛出RangeError [BITFIELD_INVALID]的直接原因是Client实例化时传入的intents配置存在两个值为undefined的项:

const client = new Client({
  intents: [
    Intents.FLAGS.GUILDS,
    Intents.FLAGS.GUILD_MESSAGES,
    Intents.NON_PRIVILEGED, // 该路径不存在,值为undefined
    Intents.GUILD_MEMBERS // 该路径不存在,值为undefined
  ]
});

discord.js v13 所有合法的Intent位域标识全部挂载在Intents.FLAGS对象下,直接访问Intents根对象上的NON_PRIVILEGED、GUILD_MEMBERS属性属于不存在的属性,返回undefined,传入位域校验逻辑时就会触发位域无效报错。

除了直接触发报错的intents配置问题,代码还存在两个会导致功能无法正常运行的逻辑bug。

修复方案

1. 修正intents配置

将所有Intent的访问路径修正为Intents.FLAGS.xxx格式,注意GUILD_MEMBERS属于特权Intent,必须先到Discord开发者后台对应机器人的Bot设置页,找到Privileged Gateway Intents板块,开启Server Members Intent开关,否则无法拉取完整的服务器成员列表。
修正后的intents配置:

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

注:Intents.FLAGS.NON_PRIVILEGED是所有非特权Intent的合集,已经显式声明了需要用到的非特权Intent时,不需要重复引入。

2. 修复消息触发判断的逻辑错误

原代码的触发判断条件:

if(!message.content.startsWith(prefix) || message.author.bot || message.author.id) return;

其中message.author.id是所有消息对象必然携带的属性,永远为真值,会导致所有消息进入事件后直接return,后续获取角色成员的逻辑永远不会执行,删掉这段多余判断即可:

if(!message.content.startsWith(prefix) || message.author.bot) return;

3. 优化角色成员获取逻辑

原逻辑是拉取全量服务器成员后遍历过滤角色,实际可以直接通过角色ID获取角色对象,直接读取角色下挂载的members集合,执行效率更高,同时补充参数校验和异常捕获,避免运行时报错:

client.on("messageCreate", async (message) =>{
    if(!message.content.startsWith(prefix) || message.author.bot) return;
    const args = message.content.slice(prefix.length).trim().split(/ +/);
    const roleId = args[1];
    if(!roleId) return message.reply("请在指令后附带要查询的角色ID");
    try {
        // 拉取全量成员保证缓存完整
        await message.guild.members.fetch();
        const targetRole = message.guild.roles.cache.get(roleId);
        if(!targetRole) return message.reply("当前服务器不存在对应ID的角色");
        // 遍历输出拥有该角色的成员
        targetRole.members.forEach(member => {
            console.log(member.user.tag, member.user.id);
        });
        message.reply(`查询完成,共找到${targetRole.members.size}名拥有该角色的成员,列表已输出到控制台`);
    } catch (err) {
        console.error("查询出错:", err);
        message.reply("查询失败,请确认已在开发者后台开启Server Members Intent权限");
    }
})
修复后可直接运行的完整代码
require('dotenv').config();
const token = process.env.bot_token;

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

const prefix = '!getUserByRole';

client.on("messageCreate", async (message) =>{
    if(!message.content.startsWith(prefix) || message.author.bot) return;
    const args = message.content.slice(prefix.length).trim().split(/ +/);
    const roleId = args[1];
    if(!roleId) return message.reply("请在指令后附带要查询的角色ID");
    try {
        await message.guild.members.fetch();
        const targetRole = message.guild.roles.cache.get(roleId);
        if(!targetRole) return message.reply("当前服务器不存在对应ID的角色");
        targetRole.members.forEach(member => {
            console.log(member.user.tag, member.user.id);
        });
        message.reply(`查询完成,共找到${targetRole.members.size}名拥有该角色的成员,列表已输出到控制台`);
    } catch (err) {
        console.error("查询出错:", err);
        message.reply("查询失败,请确认已在开发者后台开启Server Members Intent权限");
    }
})

client.login(token);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.10 16:15:45