discord.js使用MessageTyping Intent报错的原因、解决及替代方案
问题
在使用discord.js开发Discord机器人时,添加MessageTyping Intent后触发了BitFieldInvalid错误,错误信息如下:
/home/container/node_modules/discord.js/src/util/BitField.js:174 throw new DiscordjsRangeError(ErrorCodes.BitFieldInvalid, bit); RangeError [BitFieldInvalid]: Invalid bitfield flag or number: undefined. at Function.resolve.(/home/container/node_modules/discord.js/src/util/BitField.js:174:11) at /home/container/node_modules/discord.js/src/util/BitField.js:168:35 at Array.map (<anonymous>) at Function.resolve (/home/container/node_modules/discord.js/src/util/BitField.js:168:18) at new BitField (/home/container/node_modules/discord.js/src/util/BitField.js:33:38) at new IntentsBitField (/home/container/node_modules/discord.js/src/util/IntentsBitField.js:9:1) at Client._validateOptions (/home/container/node_modules/discord.js/src/client/Client.js:531:25) at new Client (/home/container/node_modules/discord.js/src/client/Client.js:80:10) at file:///home/container/index.js:17:16. at ModuleJob.run (node:internal/modules/esm/module_job:234:25) { code: 'BitFieldInvalid' }
相关Intent配置代码:
import 'dotenv/config'; import { Client, GatewayIntentBits, ActivityType, EmbedBuilder } from 'discord.js'; import axios from 'axios'; import fs from 'fs'; import sharp from 'sharp'; import { PNG } from 'pngjs'; import cron from 'node-cron'; // Import pixelmatch dynamically at the start let pixelmatch; (async () => { pixelmatch = (await import('pixelmatch')).default; })(); const DISCORD_TOKEN = process.env.DISCORD_TOKEN; const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent, GatewayIntentBits.GuildMembers, GatewayIntentBits.MessageTyping, // 채팅 입력 감지 ], });
附带!핑命令处理代码(需求包含检测用户输入中的逻辑):
if (message.content.startsWith('!핑')) { try { // 응답속도 계산 const start = Date.now(); const msg = await message.channel.send('Pong!'); const ping = Date.now() - start; // 응답속도 임베드 const embed = new EmbedBuilder() .setTitle('🏓 퐁!') .setDescription(`현재 봇의 응답속도(ms)는 ${ping} 입니다.`) .setColor('#FFFF00') .setTimestamp(); await msg.edit({ content: '', embeds: [embed] }); // 유저가 입력 중일 때 const filter = (m) => m.author.id === message.author.id && m.content; const collector = message.channel.createMessageCollector({ filter, time: 3000 }); collector.on('collect', async () => { await msg.channel.send('.....그런데 봇은 왜 핑 퐁이 기본이라는 걸까요...?'); collector.stop(); // 메시지 수집기 중지 }); collector.on('end', () => { if (collector.collected.size === 0) { msg.channel.send('.....그런데 봇은 왜 핑 퐁이 기본이라는 걸까요...?'); } }); } catch (error) { console.error('!핑 명령어 처리 중 오류 발생:', error); } } });
错误原因
discord.js的GatewayIntentBits枚举中不存在MessageTyping这个字段,Discord官方网关也没有单独的Typing相关Intent权限——Typing事件(如typingStart)属于默认可监听的事件范畴,无需额外声明Intent。添加这个不存在的枚举值会导致BitField解析失败,抛出BitFieldInvalid错误。
修复方法
直接移除配置中错误的GatewayIntentBits.MessageTyping行即可,修正后的Intent配置如下:
const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent, GatewayIntentBits.GuildMembers, // 移除了不存在的MessageTyping Intent ], });
替代实现方案(检测用户输入状态)
因为无需额外Intent即可监听Typing事件,直接通过discord.js提供的typingStart事件实现用户输入状态检测即可。针对你在!핑命令中需要检测用户是否输入的需求,可以修改代码如下:
if (message.content.startsWith('!핑')) { try { // 응답속도 계산 const start = Date.now(); const msg = await message.channel.send('Pong!'); const ping = Date.now() - start; // 응답속도 임베드 const embed = new EmbedBuilder() .setTitle('🏓 퐁!') .setDescription(`현재 봇의 응답속도(ms)는 ${ping} 입니다.`) .setColor('#FFFF00') .setTimestamp(); await msg.edit({ content: '', embeds: [embed] }); // 监听用户输入事件 let typingDetected = false; const typingHandler = (channel, user) => { if (channel.id === message.channel.id && user.id === message.author.id) { typingDetected = true; msg.channel.send('.....그런데 봇은 왜 핑 퐁이 기본이라는 걸까요...?'); // 移除监听避免重复触发 client.off('typingStart', typingHandler); } }; client.on('typingStart', typingHandler); // 3秒后结束监听,若未检测到输入则发送消息 setTimeout(() => { client.off('typingStart', typingHandler); if (!typingDetected) { msg.channel.send('.....그런데 봇은 왜 핑 퐁이 기본이라는 걸까요...?'); } }, 3000); } catch (error) { console.error('!핑 명령어 처리 중 오류 발생:', error); } }
内容的提问来源于stack exchange,提问作者hg y
相关产品推荐
相关产品推荐

