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

Discord.js按钮交互收集器无报错失效问题排查

问题分析与修复

你的代码里有两个关键错误,直接导致了交互失败的问题:

1. 收集器组件类型不匹配

你创建收集器时指定的componentType: ComponentType.StringSelect是针对下拉选择菜单的,但你实际添加的是按钮组件,应该改成ComponentType.Button,否则收集器根本监听不到按钮的点击事件。

2. 未对按钮交互进行回应

Discord的组件交互规则明确要求:所有用户触发的组件交互(比如点击按钮),必须在3秒内调用回应方法(比如i.deferUpdate()、i.reply()),否则就会显示“This interaction failed”。你现在的代码只打印了日志,没有做任何回应,这是核心问题。

另外补充:按钮交互里没有i.values属性,这个是下拉菜单的专属属性,按钮需要用i.customId来区分不同按钮的点击。


修正后的核心代码

// Send the message and add buttons
await interaction.reply({content: 'Game posted.', fetchReply: true});
const message2 = await client.channels.cache.get('1077612967639666738').send({
    content: `${teamMessage1} vs ${teamMessage2}`,
    components: [row],
});

// 修正组件类型为Button
const collector = message2.createMessageComponentCollector({ componentType: ComponentType.Button, time: 3_600_000 });

collector.on('collect', async i => {
    // 先回应交互,避免Discord报错
    await i.deferUpdate();
    // 按钮用customId区分,而非values
    console.log(`${i.user.tag} 点击了按钮:${i.customId}`);
});

如果需要给用户反馈(比如点击按钮后显示提示),也可以把deferUpdate()换成i.reply({content: '已记录你的选择', ephemeral: true}),ephemeral: true表示只有点击用户能看到这条回复。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 07:03:14