還在用setInterval處理定期重複動作?試試node-cron替你做排程!

前言

在開發專案時很容易遇到需要的情況,比方說我希望商品的庫存定期刷新、資料庫定期備份、程式每30分鐘提醒我要起來動一動之類的,在不仰賴套件的情況下,最值觀的作法當然還是setInterval,但如果你今天是希望更複雜一點的設定呢?試想以下幾個case

  • 客戶希望每晚過12點商品就自動刷新庫存回50個
  • 媽媽希望你每年至少生日時要跟她說生日快樂(這個例子實在有點糟糕)
  • 主管希望每周一早上10~11點要對資料進行備份
  • 我希望程式每隔5秒就跟我說我好棒棒

這些case我們等等都會利用本篇文章的要介紹的套件一個個完成!

認識node-cron

node-cron是個廣泛被使用的排程工具,同樣類似的還有node-schedule,兩者比較下來我個人更偏好node-cron一點!我們先看一下 node-cron 的基本用法。

var CronJob = require('cron').CronJob;
new CronJob('* * * * * *', function() {
  console.log('You will see this message every second');
}, null, true, 'America/Los_Angeles'); 

從上方的CronJob實例可以看出CronJob接受了幾個參數以及一個callback,若你只是想使用基本用法的話,你只要知道注意前兩個參數,也就是時間以及你想執行的callback。

時間參數可以是JS的Date物件(2019-04-14之類的),或是符合cron語法的時間格式, cron 語法的時間格式需要六個參數,從左到右分別是秒(0-59)、分(0-59)、時(0-23)、日(0-30)、月(0-11)星期幾(0-6)

時間格式中每個參數都可以加入以下的屬性
*表示全包含,以上方的例子來說就是最小單位,每一秒做一次callback
-表示範圍
/表示每隔..時間便做一次操作

基本說明看完之後可能會有些模糊,尤其是可加入的屬性,接著看一下例子就會清楚很多了。

使用示範

Case1:客戶希望每晚過12點商品就自動刷新庫存回50個

由於是每天12點,我們需要處理的只有秒、分以及時的參數。

var CronJob = require('cron').CronJob;
const job = new CronJob('00 00 00 * * *', function () {
  console.log('把庫存調回50吧!');
});

job.start() 

這邊稍微注意一下,示範的用法與上方有點小差別,只是做個示範讓讀者了解可以用start這個method去觸發CronJob,當然你還是可以寫成最初的例子,會有一樣的效果。

var CronJob = require('cron').CronJob;
new CronJob('00 00 00  * * *', function() {
   console.log('把庫存調回50吧!'); 
}, null, true);  

Case2: 媽媽希望你每年至少生日時要跟她說生日快樂

這邊先澄清一下,我與我媽的關係良好,有定期回家跟報平安,不是什麼不肖子。
像這樣的情況我們要修改的便只有日、月這兩個參數!

var CronJob = require('cron').CronJob;
new CronJob('* * * 11 3 *', function() {
   console.log('在每年的4/12跟媽媽說生日快樂!'); 
}, null, true);   

Case3: 主管希望每周一早上10~11點要對資料進行備份(注意是10點一次,11點再一次)

這個要求聽起來有點奇怪..每周備份兩次也就算了,間隔這麼近也沒什麼意義吧?不過老闆要求的事情你就老實的幹吧! 這邊我們就會需要用到先前提過的的時間參數屬性!

var CronJob = require('cron').CronJob;
new CronJob('* * 9-10 * * 1', function() {
   console.log('資料備份囉!!'); 
}, null, true);    

特別注意星期幾的問題0表示星期天~!

Case4: 我希望程式每隔5秒就跟我說我好棒棒

有點悲哀的要求,well~

var CronJob = require('cron').CronJob;
new CronJob('*/5 * * * * *', function() {
   console.log('阿你不就好棒棒?'); 
}, null, true);    

注意一下這邊step屬性的用法(/),若沒有加入*程式會報錯,這點與node-schedule較為不同!

結語

本篇文章我們介紹了node-cron這個好用的排程小工具,當然介紹的用法都相當的單純,裡面其實也還有一些參數可以設定讓使用上更為方便,但若只是要處理一些定期排程的小案件!我相信這樣已經相當足夠了!若有興趣的話還可以查閱以下的參考文章~!

參考文章

node-cron examples
node-cron attributes

發表留言