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

discord.js中Cron Job定时任务不运行、无报错如何解决

Discord定时消息Cron任务不执行修复方案

你的定时任务静默不触发,是3个核心问题导致的,按下面改就行:

  • 首先是cron包的表达式规则不匹配:你用的cron npm包默认CronJob接收6位cron表达式,顺序是秒 分 时 日 月 周,你写的5位00 20 * * *会被解析错位,根本匹配不到每日20点;同时默认时区是UTC,不指定本地时区的话,就算写对6位表达式,触发时间也会差8小时。
  • 其次是没有任何错误捕获和日志:cron回调内部抛的错误不会被外层的ready事件监听捕获,只要获取服务器、获取频道、发消息任意一步因为缓存没命中、权限不足报错,就会直接静默失败,控制台看不到任何报错。
  • 最后是测试逻辑不对:你要测试启动2分钟后触发,不能用固定cron表达式,直接传启动后2分钟的Date对象当触发时间即可,不用手动计算cron规则。

修复后可直接运行的代码

// 加标记防止机器人重连时重复创建定时任务
let cronScheduled = false;
client.on("ready", () => {
  console.log(`${client.user.tag} Has logged in`);
  if (cronScheduled) return;
  cronScheduled = true;

  // 测试用:启动2分钟后触发,验证通过后替换成下方注释的每日20点配置即可
  const testTriggerTime = new Date(Date.now() + 2 * 60 * 1000);
  const scheduledMessage = new cron.CronJob(
    testTriggerTime,
    // 正式环境每日北京时间20点触发,取消下行注释、注释掉上面的testTriggerTime即可
    // '0 0 20 * * *',
    async () => {
      try {
        console.log('定时任务触发,开始发送提醒');
        const guild = client.guilds.cache.get('996457970328158328');
        if (!guild) throw new Error('未找到对应服务器,请确认机器人已加入该服务器');
        const channel = guild.channels.cache.get('996458112959643728');
        if (!channel) throw new Error('未找到对应频道,请确认频道ID正确、机器人有频道访问权限');
        await channel.send('Hey @everyone plz join todays scrum');
        console.log('提醒消息发送成功');
      } catch (err) {
        console.error('定时任务执行出错:', err);
      }
    },
    null, // 内置完成回调,无需求可传null
    true, // 开启自动启动,不用额外调用start方法
    'Asia/Shanghai' // 指定时区为北京时间,可根据自己所在地区调整
  );
});

验证注意事项

  1. 先跑测试版本,启动后等2分钟看控制台日志,要是触发失败会直接打印具体错误,常见问题就是机器人没进对应服务器、没有频道发消息权限、ID填错。
  2. 测试触发正常后,替换成每日20点的cron表达式即可长期运行。
  3. 记得给机器人开启对应频道的「发送消息」「@所有人」权限,不然消息会发送失败。

内容的提问来源于stack exchange,提问作者Irtiza Khan Labib

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:03:14