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

