Discord.js v13 收集按钮交互并校验按钮id是否为cash
核心错误点
- 收集器绑定对象错误:当前代码在触发指令的原
message对象上创建按钮交互收集器,但按钮组件挂载在你新回复的msg消息上,原消息无法捕获到新消息上的按钮交互,自然无法触发customId判断逻辑。 - 交互响应位置错误:
filter函数仅用于做交互合法性校验、返回布尔值,你在filter内直接调用i.deferUpdate()会导致交互响应时机错乱,容易触发Discord的3秒交互超时报错。
修正后可运行代码
// 如果你使用async/await写法,直接用下面的逻辑即可 const msg = await message.reply({ embeds: [dembed], components: [row1, row2] }); const filter = i => i.user.id === message.author.id; // 注意:收集器必须绑定到携带按钮的新回复消息msg上 const collector = msg.createMessageComponentCollector({ componentType: 'BUTTON', filter, time: 15000 }); collector.on('collect', async i => { // 交互触发后先延迟更新,避免3秒超时报错 await i.deferUpdate(); if (i.customId === 'cash') { msg.channel.send("test"); } }); // 可选:收集器超时结束后的回调,可按需添加 collector.on('end', collected => { console.log(`15秒倒计时结束,共捕获${collected.size}次有效按钮点击`); });
注意事项
- 如果你坚持使用
.then()链式调用而非async/await,收集器的所有逻辑必须写在then的回调内部,确保拿到新回复的msg实例后再创建收集器,不要在then外部访问未赋值的msg变量。 - 所有Discord按钮交互必须在触发后3秒内给出响应,你可以根据业务需求选择
deferUpdate()、reply()、update()等响应方式,未按时响应会直接给用户抛"交互失败"的提示。
内容的提问来源于stack exchange,提问作者Expensive Salt
相关产品推荐
相关产品推荐

