如何修复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 ] });
额外代码问题修复(可选)
原代码还有两处潜在问题:
ready事件中引用的server_ip定义在事件之后,会触发ReferenceError,需将server_ip移到ready事件前定义- 外层
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
相关产品推荐
相关产品推荐

