用node-schedule实现node后台定时任务

背景

最近在自己的小程序中增加了多币种支持涉及到汇率的更新,于是需要在后台服务端设置一个定时任务来自动通过响应的接口更新最新的汇率。获取汇率的接口目前通过聚合数据提供的免费接口实现(调到需要实名注册)。

node-schedule

由于小程序后端服务器是基于node,查一下,果然是有对应的npm包的——node-schedule

node-schedule可以使用多种方式定义定时任务的,一般使用类似liunx的cron方式就可以满足绝大部分需求了。cron的定义方式参考如下表:

1
2
3
4
5
6
7
8
9
*    *    *    *    *    *
┬ ┬ ┬ ┬ ┬ ┬
│ │ │ │ │ │
│ │ │ │ │ └ 星期 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)

如果你熟悉linux系统的crontab定时任务的话,那就相当简单了。

它还支持基于日期的定时任务以及基于rule的定时任务。详细可以见一下官方说明。

https://www.npmjs.com/package/node-schedule

实现方法

首先需要安装node-schedule包,并保存在项目的package.json中。

1
cnpm install node-schedule --save

我的需求是每三十分钟自动更新一次数据,那么通过cron的方式就可以定义为如下规则:

1
0 */30 * * * *

其中*/30是指可以被30整除的,也就是0分和30分的时候。规则确定了,那么代码就很简单了:

1
2
3
4
5
6
7
8
9
10
const schedule = require('node-schedule')

function scheduleCron () {
schedule.scheduleJob('0 */30 * * * *', function () {
console.log('scheduleCron ' + new Date())
// do something
})
}

scheduleCron()

输出结果:

1
2
scheduleCron Wed Jan 02 2019 00:00:00 GMT+0800 (CST)
scheduleCron Wed Jan 02 2019 00:30:00 GMT+0800 (CST)

注意!

根据官方说明node-schedule是基本上支持所有的cron表达式,除了一下几个:

W:最近的工作日,放在日期(day of month)字段,比如15W指到本月15日最近的工作日。

L:表示最后,放在星期(day of month)或者星期(day of week)字段。

#:表示每月的周几,放在星期(day of week)字段。

cron拓展

配置规则时几个常用的符号:

*:表示匹配任意值。

/x/y表示等步长序列,可以理解为从x开始,每y个单位执行一次。其中*/50/5是等效的,都是指每5分钟执行一次。

,:表示序列的分割,比如3,4指在3和4的时候执行。

-:表示一个范围,比如3-5指在3到5的时候执行。

?:仅用在日期和星期字段,表示任意的值,相当于占位。