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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 15:08:14