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

Discord.js v12 setInterval定时编辑消息时client.ready内代码不触发怎么办

问题原因
  • client.on('ready', callback)的回调仅会在Discord客户端完成登录、资源加载完成后触发唯一一次。你在定时调用的editMessage中重复绑定该事件,此时客户端早已完成就绪流程,不会再次触发事件,因此内部逻辑永远不会执行。
  • 首次运行正常是因为首次调用editMessage时客户端还未完成就绪,绑定的回调能被触发一次,后续定时触发时不会再执行。
修复方案

调整逻辑:将ready事件绑定全局仅执行一次,定时任务和消息编辑逻辑都脱离事件绑定,确保客户端就绪后再启动定时任务。
修正后代码示例:

// 全局仅绑定一次ready事件
client.on('ready', () => {
  console.log('客户端已就绪,启动定时任务');
  // 就绪后再启动定时任务,避免客户端未初始化完成报错
  setInterval(function () { 
    var data = getData(response, list); 
    editMessage(data);
  }, 60000);
});

// editMessage不再绑定ready事件,直接执行编辑逻辑
function editMessage(data) {
  client.guilds.cache.get('server')
    .channels.cache.get('channel')
    .messages.fetch('message')
    .then(message => {
      // 此处可替换为使用data参数组装的消息内容
      message.edit('new message content');
    }).catch(err => {
      console.error('消息编辑失败:', err);
    });
}
适配Discord.js v12的额外注意事项
  • 确保你填写的服务器ID、频道ID、消息ID都是正确的字符串格式,不要直接使用示例中的占位符
  • 可以给guilds.cache.get、channels.cache.get添加空值判断,避免缓存丢失时抛出未定义错误
  • 不要在循环、定时任务或重复调用的函数中绑定任何client事件,所有事件监听全局仅需要绑定一次

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:06:03