Node.js使用node-schedule定时任务无限重复触发问题求助
解决node-schedule定时任务无限重复触发的问题
嘿,我一眼就看出问题出在哪了——你最后把处理好的日期数组转成了字符串传给schedule.scheduleJob,而node-schedule会把字符串参数当成cron表达式解析,不是一次性执行的日期!这就导致任务被当成重复调度的规则,自然会无限触发了。
正确的解决思路
你不需要手动处理数组再转字符串,直接把UTC时间戳转成Date实例传给scheduleJob就行,不管用moment.js还是原生JS都能轻松搞定:
方法1:用moment.js转Date对象
moment已经帮你处理好了月份的偏移问题,不需要手动减一,直接调用toDate()就能拿到符合要求的Date实例:
const schedule = require('node-schedule'); const moment = require('moment'); // 你的UTC秒级时间戳 const dateInUTC = 1516196220; // 直接转成Date对象 const targetDate = moment.unix(dateInUTC).toDate(); // 调度一次性任务 schedule.scheduleJob(targetDate, function(){ console.log('The world is going to end today.'); });
方法2:原生JS直接处理时间戳
如果不想依赖moment,用原生JS也能搞定——注意JS的Date构造函数接受的是毫秒级时间戳,所以要把你的unix秒级时间戳乘1000:
const schedule = require('node-schedule'); const dateInUTC = 1516196220; // 转成毫秒级时间戳,生成Date实例 const targetDate = new Date(dateInUTC * 1000); schedule.scheduleJob(targetDate, function(){ console.log('The world is going to end today.'); });
为什么之前的写法会重复触发?
你之前把处理后的数组转成了类似"2018,0,17,19,07,0"的字符串,node-schedule会尝试把这个字符串解析为cron表达式,但这个格式完全不符合cron的规则(cron是分、时、日、月、周、年的空格分隔格式),导致它默认生成了一个重复执行的调度规则,所以控制台才会持续输出日志。
记住:schedule.scheduleJob只有传入Date实例时,才会执行一次性任务;如果是字符串(cron表达式)或者规则对象,才会重复执行。
内容的提问来源于stack exchange,提问作者shamon shamsudeen
相关产品推荐
相关产品推荐

