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

Discord.js v14交互点击报错但按钮仍可用问题排查

错误定位与修复方案

1. 组件收集器绑定对象错误

你用message.channel.createMessageComponentCollector创建的收集器会监听整个频道的所有选单交互,而非仅你发送的这条help消息的选单。这会导致交互响应逻辑混乱,触发Discord的交互超时提示。

修复代码:

// 把收集器绑定到初始发送的help消息
const collector = initialMessage.createMessageComponentCollector({
    filter,
    componentType: 'SELECT_MENU', // 后续修复这个参数
    max: 13,
});

2. ComponentType参数类型不符合Discord.js v14要求

Discord.js v14中,MessageComponentCollector的componentType必须传入ComponentType枚举值,不能用字符串'SELECT_MENU'。这个错误会导致收集器无法正确过滤组件类型,引发交互处理异常。

修复代码:
首先导入ComponentType:

const { Client, Message, MessageEmbed, MessageActionRow, MessageSelectMenu, ComponentType } = require('discord.js');

然后修改收集器配置:

const collector = initialMessage.createMessageComponentCollector({
    filter,
    componentType: ComponentType.SelectMenu,
    max: 13,
});

3. 选单选项的emoji可能为无效值

当某个命令分类在emojis对象中没有对应表情时,你设置了emoji: { name: null },而Discord API不接受name为null的emoji对象,这会导致组件存在无效数据,触发错误提示。

修复代码:
调整选单选项的生成逻辑,没有对应表情时不设置emoji字段:

categories.map(cmd => {
    const emojiName = emojis[cmd.directory.toLowerCase()];
    const option = {
        label: cmd.directory,
        value: cmd.directory.toLowerCase(),
        description: `Commands from ${cmd.directory} category`,
    };
    if (emojiName) option.emoji = { name: emojiName };
    return option;
})

4. 可选优化:收集器结束后禁用选单

当收集器达到max:13次交互后会停止工作,但选单仍可点击,此时用户再次点击会触发无响应错误。可以监听收集器结束事件,禁用选单:

collector.on('end', () => {
    initialMessage.edit({ components: components(true) });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:05:41