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
相关产品推荐
相关产品推荐

