1. 簡介
node-cron
是一個輕量級的Node.js庫,用于在指定時間或間隔執行任務。它是Unix系統cron工具的JavaScript實現,適用于需要定時執行腳本的場景(如數據備份、定期爬蟲等)。
2. 安裝
npm install node-cron
# 或
yarn add node-cron
3. 基礎用法
import cron from 'node-cron';// 每分鐘執行
cron.schedule('* * * * *', () => {console.log('每分鐘觸發');
});
4. Cron表達式詳解
表達式由5個字段組成:
* * * * *
┬ ┬ ┬ ┬ ┬
│ │ │ │ │
│ │ │ │ └── 星期幾 (0 - 7) (0和7代表周日)
│ │ │ └────── 月份 (1 - 12)
│ │ └────────── 日期 (1 - 31)
│ └────────────── 小時 (0 - 23)
└─────────────────── 分鐘 (0 - 59)
常用示例:
表達式 | 說明 |
---|---|
*/5 * * * * | 每5分鐘 |
0 * * * * | 每小時整點 |
0 0 * * * | 每天午夜 |
0 9 * * 1-5 | 工作日早上9點 |
30 3 15 * * | 每月15日凌晨3:30 |
5. 高級功能
5.1 帶參數配置
const task = cron.schedule('*/10 * * * *', () => {console.log('每10分鐘執行');
}, {scheduled: true, // 是否立即啟動timezone: 'Asia/Shanghai' // 時區設置
});
5.2 任務控制
// 暫停任務
task.stop();// 恢復任務
task.start();// 檢查任務狀態
console.log(task.getStatus()); // 返回 'running' 或 'stopped'
6. 實際應用示例
示例1:每日數據清理
import cron from 'node-cron';
import cleanupDatabase from './cleanup.js';// 每天凌晨3點清理
cron.schedule('0 3 * * *', () => {console.log('開始數據庫清理...');cleanupDatabase();
});
示例2:API定時請求
import axios from 'axios';// 每30分鐘獲取天氣數據
cron.schedule('*/30 * * * *', async () => {const res = await axios.get('https://api.weather.com/data');console.log('天氣數據:', res.data);
});
7. 注意事項
- 精度問題:Node.js事件循環可能導致最多幾毫秒的延遲
- 錯誤處理:務必在任務函數中添加try/catch
- 長任務:避免任務執行時間超過間隔時間
- 集群環境:在多進程部署時需要額外處理防止重復執行
8. 替代方案
node-schedule
:更復雜的調度規則bull
:分布式任務隊列- 系統級cron:通過
child_process
調用
🚀 提示:在生產環境中建議添加日志記錄和監控,可以使用
winston
或bunyan
記錄任務執行情況。
參考資料:
- node-cron官方文檔:https://github.com/node-cron/node-cron
- Cron表達式標準:IEEE Std 1003.1
點個收藏,關注前端結城,一起用代碼點亮前端世界!🚀