nodejs 定时任务的执行
- setInterval 内置模块
- node-schedule第三方库
- 安装
- 使用
- 参数详解
- 例子
- node-cron第三方库
- 安装
- 使用
- 参数详解
- 例子
- 区别
setInterval 内置模块
Node.js 内置了一个定时器模块 setInterval
和setTimeout
,可以帮助我们实现简单的定时任务。该方法接受两个参数:要执行的函数和时间间隔。示例代码如下:
// 使用 setTimeout 执行一次函数
setTimeout(() => {
console.log("这是一个定时任务 - 一次性执行");
}, 1000); // 1秒后执行
// 使用 setInterval 每隔一段时间执行函数
const intervalId = setInterval(() => {
console.log("这是一个定时任务 - 重复执行");
}, 2000); // 每2秒执行一次
// 清除定时任务
clearInterval(intervalId); // 停止重复执行
可以根据实际业务需要来修改执行的任务内容和时间间隔,从而实现定时任务。
但是,如果我想定义一个每天早上六点执行的任务,那使用 setInterval
来实现是一件很痛苦的事情,这里推荐使用第三方库node-schedule
,就可以轻松解决,实现各种复杂的任务调动。也可使用第三方库node-cron
来解决简单的任务调动。
node-schedule第三方库
模块提供了一种更友好的 API 来设置定时任务,支持多种定时方式
安装
npm install node-schedule --save
使用
const schedule = require('node-schedule');
const rule = new schedule.RecurrenceRule();
rule.hour = 6; // 每天的第6小时执行
rule.minute = 0; // 每天的第0分钟执行
const job = schedule.scheduleJob(rule, () => {
console.log('每天早上六点执行的任务');
});
参数详解
schedule.scheduleJob('* * * * * *', function(){
});
六个*
依次代表 *
表示每
- hour: 一个数字,表示小时(0-23)。
- minute: 一个数字,表示分钟(0-59)。
- second: 一个数字,表示秒(0-59)。
- date: 一个数字,表示日期(1-31)。
- month: 一个数字,表示月份(0-11,其中 0 代表 1 月)。
- dayOfWeek: 一个数字,表示一周中的某天(0-6,其中 0 代表星期天)。
例子
- 每分钟的第30秒触发: 30 * * * * *
- 每小时的1分30秒触发 :30 1 * * * *
- 每天的凌晨1点1分30秒触发 :30 1 1 * * *
- 每月的1日1点1分30秒触发 :30 1 1 1 * *
- 每年的1月1日1点1分30秒触发 :30 1 1 1 1 *
- 每周1的1点1分30秒触发 :30 1 1 * * 1
node-cron第三方库
安装
npm install node-cron --save
使用
const cron = require('node-cron');
cron.schedule('0 0 6 * * *', () => {
console.log('每天早上六点执行的任务');
});
参数详解
cron.schedule('* * * * * *', () => {
});
Cron 表达式是一个字符串,由空格分隔的 6 或 7 个字段组成,用于指定任务的执行时间。这些字段分别代表:
-
秒(可选,范围 0-59)
-
分钟(0-59)
-
小时(0-23)
-
日期(1-31)
-
月份(1-12 或 JAN-DEC)
-
星期(0-7 或 SUN-SAT,其中 0 和 7 都代表星期天)
-
年份(可选,通常省略)
-
例子
-
每分钟的第30秒触发: 30 * * * * *
-
每小时的1分30秒触发 :30 1 * * * *
-
每天的凌晨1点1分30秒触发 :30 1 1 * * *
-
每月的1日1点1分30秒触发 :30 1 1 1 * *
-
每年的1月1日1点1分30秒触发 :30 1 1 1 1 *
-
每周1的1点1分30秒触发 :30 1 1 * 1 *
区别
node-cron
是一个基于cron
表达式的模块,cron
表达式可以用来定义定期执行的规则,支持分钟、小时、天、周、月等粒度。node-cron
使用起来比较简单,可以通过类似于命令行的方式定义定期执行的规则和要执行的任务。
node-schedule
则是一个更加灵活的定时任务调度模块,可以通过人性化的时间表达方式定义定期执行的规则,支持秒、分、时、日、周、月等维度。node-schedule
的使用更加灵活,可以处理复杂的定时任务调度场景,比如每周三执行一次,或者每个月最后一天执行一次。它还支持链式调用、取消定时任务等功能。