实际工作中,可能会遇到定时清除某个文件夹内容,定时发送消息或发送邮件给指定用户,定时导出某些数据等。
Node.js 中可以使用 node-schedule
来完成定时任务
安装
npm i node-schedule --save
使用
使用的是 Cron 风格的定时器
* * * * * *
┬ ┬ ┬ ┬ ┬ ┬
│ │ │ │ │ |
│ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun)
│ │ │ │ └───── month (1 - 12)
│ │ │ └────────── day of month (1 - 31)
│ │ └─────────────── hour (0 - 23)
│ └──────────────────── minute (0 - 59)
└───────────────────────── second (0 - 59, OPTIONAL)
6个占位符分别标识 :秒 分 时 日 月 周几
*
表示通配符,匹配该域的任意值,假如在 Minutes 域使用*
表示每分钟都会触发事件?
只能用在DayofMonth
和DayofWeek
两个域,它也匹配域的任意值,但实际不会。因为DayofMonth和DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?
,而不能使用*
,如果使用 * 表示不管星期几都会触发,实际上并不是这样。-
表示范围,例如 在 Minutes 域使用 5-20,表示从5分到20分钟每分钟触发一次/
表示起始时间开始触发,然后每隔固定时间触发一次,如在 Minutes 域使用 5/20 表示5分钟触发一次,而25,45等分别触发一次- ‘,’ 表示枚举值,如在 Minutes 域使用 5, 20,表示在 5和20分每分钟触发一次
- 由于月份中的日期和星期中的日期这两个元素互斥,必须要对其中一个设置 ?
先看几个示例熟悉一下:
每分钟的第30秒触发: '30 * * * * *'
每小时的1分30秒触发 :'30 1 * * * *'
每天的凌晨1点1分30秒触发 :'30 1 1 * * *'
每月的1日1点1分30秒触发 :'30 1 1 1 * *'
2016年的1月1日1点1分30秒触发 :'30 1 1 1 2016 *'
每周1的1点1分30秒触发 :'30 1 1 * * 1'
0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
开启定时任务
const schedule = require('node-schedule')
schedule.scheduleJob(id, '30 * * * * *', () => {
// 具体任务内容....
try {
} catch(error) {
}
})
取消定时任务
schedule.cancelJob(id)
开启定时任务是,可以传入一个id,在取消任务时就可以根据 id 来取消了。
取消定时器还有一种方法 schedule.cancel()