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

node-cron每日自动执行失效排查与修复(Heroku部署场景)

问题原因及修复方案

一、定时任务无法每日自动执行的核心原因

  • Heroku Dyno 休眠机制:Heroku的免费或基础层级Dyno,在30分钟没有外部请求的情况下会自动休眠,休眠期间所有进程(包括你的cron定时任务)都会暂停运行,直到有新请求唤醒Dyno。
  • Cron表达式不符合需求:你当前的表达式是"24 10 * * *",对应卡拉奇时间的10:24,和你需要的9:50不符;且即使表达式正确,Dyno休眠时也无法触发任务。
  • forEach结合async/await的逻辑隐患:虽然这不是定时不重复执行的直接原因,但Users.forEach(async (user) => {})会导致异步操作无法按预期顺序完成,可能出现部分考勤记录未创建的情况,属于潜在问题。

二、修复方案

1. 解决Dyno休眠问题(最关键)

  • 使用Heroku Scheduler(官方推荐):替代自定义cron任务,它会主动唤醒Dyno执行定时任务:
    1. 在Heroku控制台安装Scheduler插件。
    2. 新建单独脚本文件(比如generate-attendance.js),将生成考勤记录的逻辑迁移到该文件。
    3. 在Scheduler中设置每日执行时间(选择卡拉奇时区的9:50),执行命令为node generate-attendance.js。
  • 外部定时请求唤醒Dyno:若不想用Scheduler,可借助第三方定时服务在任务执行前几分钟给应用发HTTP请求唤醒Dyno,但这种方式可靠性不如官方插件,且免费层级服务有次数限制。

2. 修正Cron表达式(若坚持用自定义cron)

如果继续使用node-cron包,将表达式改为"50 9 * * *",对应卡拉奇时间每日9:50执行。同时必须确保Dyno不会休眠,否则仍会错过任务。

3. 修复异步逻辑问题

把forEach替换为for...of循环,确保异步操作按顺序完成:

// 替换原Users.forEach代码块
for (const user of Users) {
  const attendance = await Attendance.create({
    user: user._id,
    status: "absent",
    date,
  });
  console.log(attendance);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 17:46:26