express 定时任务 以 node schedule为例

发布于 2025-06-07  77 次阅读


1.安装 node schedule

npm install node-schedule 

2.引入 node schedule 并创建 schedule 实例

const schedule = require('node-schedule');
const { runTask } = require('./taskRunner');
const rule = new schedule.RecurrenceRule();//创建 RecurrenceRule对象来定义定时规则,注意,需要注意时区问题,时区会影响任务执行时间
rule.hour = [...Array(9).keys()].map(x => x + 15).concat([0, 1, 2, 3]); // 此处含义为 15点到凌晨三点
rule.minute = [0, 10, 20, 30, 40, 50];//分钟此处含义为 每小时的 0 ,10 ,20 ,30 ,40 ,50 分钟时执行一次任务 例 9点10分会执行一次
rule.second = 0; //此处为秒,使用同分钟
rule.tz = 'Asia/Shanghai';  // 指定时区 此处指定为上海时间
let job;//建立全局job变量
async function  startJob(){
    if(job){
        return '任务执行中,请勿再次提交任务'
    }
    job = schedule.scheduleJob(rule, async () => {
        console.log(`任务执行时间(上海时区): ${new Date().toLocaleString('zh-CN', {       timeZone: 'Asia/Shanghai' })}`);//初始化schedule实例
        await runTask(); // 需要执行的定时任务方法
    });
    return '任务开启成功'
}

async function stopJob(){//停止任务
    if(!job){
        return '无任务执行,不需要暂停'
    }
    job.cancel()//调用cancel方法停止job
    job = null;//清空job
    return '任务暂停成功'
}

// 全局暴露开始结束方法以便手动开启,停止
module.exports = {stopJob,startJob};

3.job在接口中使用

// 手动启动任务
router.post('/taskRunStart', async (req, res) => {
    let message = await startJob()
    res.json({status: 'start', message: message});
});
// 手动暂停任务
router.post('/taskStop', async (req, res) => {
    let message = await stopJob()
    res.json({status: 'stopped', message: message});
});
一个练习时长还差一年半的切图仔,有需求可联系 QQ:963827384
最后更新于 2025-06-07