Node.jsで定期実行メモ


毎回忘れるので自分用メモです。
[Node Cron](https://www.npmjs.com/package/node-cron)を使います。

## 準備

```
$ npm init -y
$ npm i node-cron
```

## Cronの書式

https://www.npmjs.com/package/node-cron#cron-syntax

```
 # ┌────────────── second (optional)
 # │ ┌──────────── minute
 # │ │ ┌────────── hour
 # │ │ │ ┌──────── day of month
 # │ │ │ │ ┌────── month
 # │ │ │ │ │ ┌──── day of week
 # │ │ │ │ │ │
 # │ │ │ │ │ │
 # * * * * * *
```

* 6段階あって左から秒,分,時間,日,月,曜日
* 秒はオプショナルなので5段階設定しておけば動きはします。

らしいです。

## 試す

公式サンプルが分単位のサンプルばかりで試しづらいので基本は秒単位の試し方を書いてます。

### 毎秒実行

* `cron.schedule()`の*が6つ

```app.js
'use strict';

const cron = require('node-cron');
cron.schedule('* * * * * *', () => console.log('毎秒実行'));
```

### 毎分実行

* `cron.schedule()`の*が5つ
* 毎秒実行よりも*が少ない

```app.js
'use strict';

const cron = require('node-cron');
cron.schedule('* * * * *', () => console.log('毎分実行'));
```

### 毎分の1秒、10秒、30秒、55秒に実行

```app.js
'use strict';

const cron = require('node-cron');
cron.schedule('1,10,30,55 * * * *', () => console.log('毎分1秒,10秒,30秒,55秒に実行'));
```

### 毎分の1秒~10秒に実行

* 1-10みたいな記述が出来ます。

```app.js
'use strict';

const cron = require('node-cron');
cron.schedule('1-10 * * * * *', () => console.log('毎分1秒~10秒に実行'));
```

実行すると、毎分10回実行されますね。

```bash
$ node app.js
毎分1秒~10秒に実行
毎分1秒~10秒に実行
毎分1秒~10秒に実行
毎分1秒~10秒に実行
毎分1秒~10秒に実行
毎分1秒~10秒に実行
毎分1秒~10秒に実行
毎分1秒~10秒に実行
毎分1秒~10秒に実行
毎分1秒~10秒に実行

```

### 3秒ごとに実行

* */3とすると`3秒ごと`とか`3分ごと`みたいな指定です。
* */10だと10分ごと

```app.js
'use strict';

const cron = require('node-cron');
cron.schedule('*/3 * * * * *', () => console.log('3秒ごとに実行'));
```

### 毎日0時,6時,12時,18時に実行

結構使いそうな間隔

```app.js
'use strict';

const cron = require('node-cron');
cron.schedule('0 0 0,6,12,18 * * *', () => console.log('毎日0時,6時,12時,18時に実行'));
```

### 3時間おきの指定時間(3,6,9,12,15,18,21)実行

```
'use strict';

const cron = require('node-cron');
cron.schedule('0 0 0,3,6,9,12,15,18,21, * * *', () => console.log('3時間おきの指定時間実行'));
```

### 3時間おき実行

```
'use strict';

const cron = require('node-cron');
cron.schedule('0 0 */3 * * *', () => console.log('3時間おきの実行'));
```

### 23時59分59秒に実行したい

```app.js
'use strict';

const cron = require('node-cron');
cron.schedule('59 59 23 * * *', () => console.log('毎日23時59分59秒に実行'));
```

## できなかったネタ

### 24時は指定できない

毎日24時に実行したくて、こんな指定をすると怒られます。

```app.js
'use strict';

const cron = require('node-cron');
cron.schedule('0 0 24 * * *', () => console.log('毎日24時に実行'));
```

```bash
$ node app.js

/Users/n0bisuke/dotstudio/playground/cron-test/node_modules/node-cron/src/pattern-validation.js:54
      throw patterns[2] + ' is a invalid expression for hour';
      ^
24 is a invalid expression for hour
```

1日は0:00~23:59になるので24時ってのはほんとはダメなんですね。

毎日24時に実行させたい場合は0を指定しましょう。

```app.js
'use strict';

const cron = require('node-cron');
cron.schedule('0 0 0 * * *', () => console.log('毎日24時に実行'));
```

### 60分や60秒も指定できない

24時同様に60分や60分も指定できません。

```app.js
'use strict';

const cron = require('node-cron');
cron.schedule('60 60 0 * * *', () => console.log('60秒や60分の指定'));
```

怒られますね。

```bash
$ node app.js

/Users/n0bisuke/dotstudio/playground/cron-test/node_modules/node-cron/src/pattern-validation.js:50
      throw patterns[1] + ' is a invalid expression for minute';
      ^
60 is a invalid expression for minute
```

## 所感

地味に24H指定してハマってたので気をつけましょう笑

随時サンプルアップデートしたい