Node.js 任务调度器 (node-cron, node-schedule, Bull)

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Node.js 任务调度器:概述与使用示例



在现代后端开发中,经常需要按计划执行代码:发送邮件推送、清理缓存、创建数据库备份或更新聚合数据。在 Node.js 生态系统中,有多个成熟的库可用于此目的。本文将介绍任务调度的三种主要方法:经典 cron、灵活调度和任务队列。



1. node-cron — JavaScript 的经典 cron



node-cron 是一个极简的库,允许你通过标准的 cron 表达式来运行函数。它非常适合简单的周期性任务(每分钟、每小时、每天凌晨 3 点)。



安装:



npm install node-cron


一个每分钟执行一次的任务示例:



const cron = require('node-cron');

cron.schedule('* * * * *', () => { console.log('任务每分钟执行一次');});


cron 表达式结构:秒 分钟 小时 日 月 星期(在 node-cron 中秒是可选的)。



表达式示例:

  • '0 0 * * *' — 每天午夜
  • '*/5 * * * *' — 每 5 分钟
  • '0 9-18 * * 1-5' — 工作日每小时 9 点到 18 点
  • '30 3 * * 0' — 每周日凌晨 3:30


该库支持表达式验证以及任务的启动/停止:



const task = cron.schedule('*/10 * * * *', () => {  // 每 10 分钟执行的任务});

// 停止任务task.stop();

// 恢复任务task.start();

// 检查任务是否激活console.log(task.isStarted()); // true/false


使用场景: 适用于简单的周期性操作,无需状态存储或错误处理。



2. node-schedule — 支持递归规则的灵活调度



node-schedule 是一个更强大的替代方案,不仅可以通过 cron 设置调度,还可以通过显式指定日期、星期几和时间的 JavaScript 对象来设置。



安装:



npm install node-schedule


使用 cron 表达式的示例:



const schedule = require('node-schedule');

const job = schedule.scheduleJob('*/5 * * * *', () => { console.log('每 5 分钟执行一次');});


主要优势在于可以通过对象设置调度:



const job = schedule.scheduleJob({  hour: 14,  minute: 30,  dayOfWeek: [1, 3, 5] // 星期一、星期三、星期五}, () => {  console.log('工作日 14:30');});


还可以在特定日期安排一次性任务:



const date = new Date(2025, 11, 31, 23, 59, 0);

schedule.scheduleJob(date, () => { console.log('新年到了!');});


该库支持取消任务和检查下次执行时间:



// 取消任务job.cancel();

// 获取下次执行日期console.log(job.nextInvocation()); // Date 对象


使用场景: 需要精确时间控制、组合规则或一次性任务时。



3. Bull — 带调度和重试机制的任务队列



Bull 是一个基于 Redis 的完整队列系统,包含强大的调度器。Bull 不仅可以延迟任务,还可以管理重试、优先级和并行执行。



安装:



npm install bull


一个包含延迟任务的基本队列示例:



const Queue = require('bull');

const emailQueue = new Queue('email', { redis: { host: 'localhost', port: 63

推荐