基于 Node.js 的任务调度器:node-schedule 和 node-cron

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

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

开始课程

基于 Node.js 的任务调度器:node-schedule 和 node-cron



在现代 Web 开发中,经常需要在指定时间或按固定时间间隔执行某些操作。例如,通过电子邮件发送报告、清理数据库、解析外部资源或更新缓存。在 Node.js 环境中,任务调度器就是为此目的而使用的。两个最流行的工具是 node-schedule 和 node-cron。在本文中,我们将详细分析这两者,提供代码示例,并帮助您为项目选择最合适的工具。



为什么需要在 Node.js 中使用任务调度器?

Node.js 是一个单线程、事件驱动架构的环境。内置函数 setTimeout 和 setInterval 允许您延迟或定期执行代码,但它们不适用于复杂场景:

  • 配置不够灵活(例如,“每月第二个星期一上午 10:30”)。
  • 应用程序重启后无法保持状态。
  • 管理困难(取消、修改计划)。

调度器通过提供用于创建、启动和取消定时任务的简单 API 来解决这些问题。



node-schedule 库

node-schedule 是一个灵活的调度器,基于类似 cron 的语法,但具有扩展功能。它允许您设置精确到分钟的重复任务,以及在特定日期执行的一次性任务。



安装

npm install node-schedule


主要功能

  • 支持 cron 表达式(6 个字段:秒、分钟、小时、月份中的日期、月份、星期几)。
  • 能够使用 Date 对象设置一次性执行。
  • 使用 RecurrenceRule 对象设置重复规则。
  • 用于任务管理的 cancel() 和 cancelNext() 方法。


示例 1:每 5 分钟执行一次任务

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

const job = schedule.scheduleJob('*/5 * * * *', function() { console.log('任务每 5 分钟执行一次:', new Date().toLocaleString());});

// 20 分钟后取消任务setTimeout(() => { job.cancel(); console.log('任务已取消');}, 20 * 60 * 1000);


示例 2:在特定日期执行的任务

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

const date = new Date(2025, 5, 15, 10, 30, 0); // 2025 年 6 月 15 日,10:30:00

const job = schedule.scheduleJob(date, function() { console.log('一次性任务已在', new Date().toLocaleString(), '执行');});

console.log('任务已安排在', date.toLocaleString());


示例 3:复杂的重复规则

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

const rule = new schedule.RecurrenceRule();rule.dayOfWeek = [1, 3, 5]; // 星期一、星期三、星期五rule.hour = 9;rule.minute = 0;

const job = schedule.scheduleJob(rule, function() { console.log('任务在工作日(周一、周三、周五)上午 9:00 执行');});


node-cron 库

node-cron 是一个轻量级的替代方案,基于 Unix 系统中的经典 cron。它更易于使用,但不如 node-schedule 灵活。支持 5 个字段(分钟、小时、月份中的日期、月份、星期几)。



安装

npm install node-cron


主要功能

  • 标准 cron 语法(5 个字段)。
  • start()、stop()、destroy() 方法。
  • 通过 timezone 选项支持时区。
  • 能够使用 now() 立即启动任务。


示例 1:每天午夜执行任务

const c                    

推荐