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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:06:26