node-schedule库的使用
node-schedule Cron 作业调度器的完整使用指南
#resource / nodejs
#type / howto
#status / growing
[!info] related notes
node-schedule 库的使用
- node-schedule 继承了 nodejs 中的 EventEmitter 类
- 有 run、scheduled、canceled、error、success 事件
目标
使用 node-schedule 实现定时任务调度,支持 Cron 表达式、日期触发和循环规则。
前置条件
- Node.js 16+
npm install node-schedule
步骤
1. Cron 式调度
使用 Cron 格式的时间来调度任务(秒 分 时 日 月 周):
import schedule from 'node-schedule';
// 每天凌晨 2:00 执行
const job = schedule.scheduleJob('0 2 * * *', () => {
console.log('执行每日数据清理', new Date().toISOString());
});
// 每周一至周五 9:30 执行
const weekdayJob = schedule.scheduleJob('30 9 * * 1-5', () => {
console.log('工作日早报推送');
});
// 每 5 分钟执行一次
const frequentJob = schedule.scheduleJob('*/5 * * * *', () => {
console.log('定时健康检查');
});
2. 日期式调度
使用 Date 对象来调度任务(一次性):
const targetDate = new Date('2026-06-01T10:00:00');
const oneTimeJob = schedule.scheduleJob(targetDate, () => {
console.log('活动开始通知');
// 一次性任务,执行后自动结束
});
3. 循环规则调度
使用 RecurrenceRule 对象来调度任务:
const rule = new schedule.RecurrenceRule();
rule.hour = 8;
rule.minute = 30;
rule.dayOfWeek = [1, 3, 5]; // 周一三五
const ruleJob = schedule.scheduleJob(rule, () => {
console.log('按规则执行的任务');
});
// 更细粒度的循环
const rule2 = new schedule.RecurrenceRule();
rule2.second = [0, 15, 30, 45]; // 每 15 秒
schedule.scheduleJob(rule2, () => {
console.log('高频轮询');
});
4. 任务管理
// 获取任务名称
console.log(job.name); // 自动生成的唯一名称
// 取消任务
job.cancel();
// 监听事件
job.on('run', () => console.log('任务开始执行'));
job.on('success', () => console.log('任务执行成功'));
job.on('error', (err) => console.error('任务执行出错:', err));
job.on('canceled', () => console.log('任务被取消'));
5. 优雅关闭
import schedule from 'node-schedule';
// 关闭所有任务
function gracefulShutdown() {
schedule.gracefulShutdown().then(() => {
console.log('所有定时任务已停止');
process.exit(0);
});
}
process.on('SIGTERM', gracefulShutdown);
process.on('SIGINT', gracefulShutdown);
验证
- 使用
console.log打印执行时间,确认 Cron 表达式正确 - 调用
job.cancel()后确认任务不再执行 - 发送 SIGTERM 信号,确认所有任务优雅停止不抛异常