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

如何修复discord.js机器人的Invalid Bitfield崩溃问题

Minecraft服务器查询Discord机器人启动崩溃:Invalid Bitfield报错
  • 开发的Minecraft服务器查询Discord机器人启动时触发RangeError [BITFIELD_INVALID]报错导致崩溃
  • 自认为Intents配置正常,怀疑是整合他人代码片段引发问题
  • 已尝试谷歌搜索,未找到有效解决方案

报错日志

RangeError [BITFIELD_INVALID]: Invalid bitfield flag or number: Guilds.
    at Intents.resolve (C:\Users\jason\Desktop\discord minecraft bot test 2\node_modules\discord.js\src\util\BitField.js:152:11)
    at C:\Users\jason\Desktop\discord minecraft bot test 2\node_modules\discord.js\src\util\BitField.js:147:54
    at Array.map (<anonymous>)
    at Intents.resolve (C:\Users\jason\Desktop\discord minecraft bot test 2\node_modules\discord.js\src\util\BitField.js:147:40)
    at Client._validateOptions (C:\Users\jason\Desktop\discord minecraft bot test 2\node_modules\discord.js\src\client\Client.js:550:33)
    at new Client (C:\Users\jason\Desktop\discord minecraft bot test 2\node_modules\discord.js\src\client\Client.js:76:10)
    at Object.<anonymous> (C:\Users\jason\Desktop\discord minecraft bot test 2\index.js:9:16)
    at Module._compile (node:internal/modules/cjs/loader:1159:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1213:10)
    at Module.load (node:internal/modules/cjs/loader:1037:32) {
  [Symbol(code)]: 'BITFIELD_INVALID'
}

Node.js v18.12.1
PS C:\Users\jason\Desktop\discord minecraft bot test 2>

机器人代码

const { Client, Intents, Message} = require('discord.js');
const util = require('minecraft-server-util');
const {EmbedBuilder} = require('discord.js');
const options = {
    timeout: 1000 * 5, 
    enableSRV: true 
};
const prefix = "!mcstatus"; 
const client = new Client({
    intents: [
      "Guilds",
      "GuildMessages",
      "MessageContent"
    ]
});
client.on('ready', () => {
    console.log('bot started');
    
    client.user.setPresence({ activities: [{ name: `${server_ip}`, type: 'WATCHING' }], status: 'active' });
});
const server_ip = "mc.hypixel.net"; 
const server_port = 25565; 
client.on('messageCreate', (message) => {
    if (!message.content.startsWith(prefix) || message.author.bot) return;
    if(message.content.startsWith(prefix)){
          util.status(server_ip, server_port, options)
    .then((result) => {
        const embed = new EmbedBuilder()
        let args = message.content.split(" "); // Splitting with a blank space.

        args = args.slice(1); // Remove the first argument which would be the command itself.

        const server_port = 25565; // Leave the default port for MC servers.
        
        if (args.length < 1) return message.reply("Didn't provide arguments.")
// Run a forEach loop for every argument.
        args.forEach((arg) => {
          util
            .status(arg, server_port, options)
            .then((result) => {
              const embed = new EmbedBuilder()
                .setColor("#FF0000")
                .setTitle("Results")
                .setDescription(
                  `This will show the status and info about the minecraft server \n **Server ip:** ${arg} \n **Server port:** ${server_port}`
                )
                .addFields(
                  { name: "Server Version", value: `${result.version.name}` },
                  {
                    name: "Server Protocol Version",
                    value: `${result.version.protocol}`,
                  },
                  { name: "Players Online", value: `${result.players.online}` },
                  { name: "Max Players", value: `${result.players.max}` },
                  {
                    name: "MOTD (May Not Display Accurately)",
                    value: `${result.motd.clean}`,
                  },
                  { name: "Latency", value: `${result.roundTripLatency}` }
                )
                .setTimestamp();

              message.channel.send({ embeds: [embed] });
            })
            .catch((error) => {
              const embed = new EmbedBuilder()
                .setColor("#808080")
                .setTitle("Error")
                .setDescription(
                  `${arg} was unable to be pinged or you mis-typed the info`
                )
                .setTimestamp();
              message.channel.send({ embeds: [embed] });
            });
        });
    message.channel.send({embeds: [embed]})
    
    })}});

问题原因与修复方案

核心报错原因

Discord.js v14+版本要求Intents必须使用Intents.Flags枚举值,直接传字符串(如"Guilds")会触发Bitfield验证失败,导致报错。

修复Intents配置

修改Client初始化代码,将字符串替换为Intents.Flags对应的枚举:

const client = new Client({
    intents: [
      Intents.Flags.Guilds,
      Intents.Flags.GuildMessages,
      Intents.Flags.MessageContent
    ]
});

额外代码问题修复(可选)

原代码还有两处潜在问题:

  1. ready事件中引用的server_ip定义在事件之后,会触发ReferenceError,需将server_ip移到ready事件前定义
  2. 外层util.status回调中创建的空embed无意义,且会导致发送失败,建议移除这部分冗余逻辑

修复后的完整代码示例:

const { Client, Intents, Message} = require('discord.js');
const util = require('minecraft-server-util');
const {EmbedBuilder} = require('discord.js');
const options = {
    timeout: 1000 * 5, 
    enableSRV: true 
};
const prefix = "!mcstatus"; 
const server_ip = "mc.hypixel.net"; 
const server_port = 25565; 

const client = new Client({
    intents: [
      Intents.Flags.Guilds,
      Intents.Flags.GuildMessages,
      Intents.Flags.MessageContent
    ]
});

client.on('ready', () => {
    console.log('bot started');
    client.user.setPresence({ activities: [{ name: `${server_ip}`, type: 'WATCHING' }], status: 'active' });
});

client.on('messageCreate', (message) => {
    if (!message.content.startsWith(prefix) || message.author.bot) return;
    
    let args = message.content.split(" ");
    args = args.slice(1);
    
    if (args.length < 1) return message.reply("请提供服务器IP地址");
    
    args.forEach((arg) => {
        util.status(arg, server_port, options)
            .then((result) => {
                const embed = new EmbedBuilder()
                    .setColor("#FF0000")
                    .setTitle("服务器查询结果")
                    .setDescription(`**服务器IP:** ${arg} \n **服务器端口:** ${server_port}`)
                    .addFields(
                        { name: "服务器版本", value: `${result.version.name}`, inline: true },
                        { name: "协议版本", value: `${result.version.protocol}`, inline: true },
                        { name: "在线玩家", value: `${result.players.online}`, inline: true },
                        { name: "最大玩家数", value: `${result.players.max}`, inline: true },
                        { name: "服务器描述", value: `${result.motd.clean}` },
                        { name: "延迟", value: `${result.roundTripLatency}ms`, inline: true }
                    )
                    .setTimestamp();

                message.channel.send({ embeds: [embed] });
            })
            .catch((error) => {
                const embed = new EmbedBuilder()
                    .setColor("#808080")
                    .setTitle("查询失败")
                    .setDescription(`无法连接到服务器 ${arg},请检查IP是否正确`)
                    .setTimestamp();
                message.channel.send({ embeds: [embed] });
            });
    });
});

// 补充机器人登录代码
client.login("你的机器人Token");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:25:22