Cronjobs在node.js中

是否有可能在node.js的特定时间定期调用函数? 我的第一个实现是

setInterval(functionName(),(24*60*60*1000)); 

这是不理想的,因为每次重新启动节点时都会重新启动。 有更好的可能性来实现这个吗?

为防止重新启动,您需要创build一个持久数据存储作业。

就像是 :

 Job = { _id: Number, job: String, dueDate: Date, completed: Boolean } 

然后有一些代码如下:

 var createJob = function(url, date) { var j = db.create(Job, function(j) { j.job = url; j.dueDate = date; j.save(); }); }; var runJob = function(j) { var id = j._id; setInterval(j.dueDate - Date.now(), function() { db.getOne(Job, { _id : id }, function(j) { require(j.job); j.finished = true; j.save(); }); }); j = null; }; 

开始时,你只需要做一些事情:

 db.get(Job, { finished: false }, function(jobs) { jobs.forEach(runJob); }); 

将通用dbreplace为MongoDB,CouchDB,Redis等

这是一个古老的问题,但除了被接受的答案之外,一个有例子的图书馆也值得一提。

cron是一个轻量级的包,它以给定的时间间隔运行指定的函数,只使用系统的时间和没有数据库持久性。

 const CronJob = require('cron').CronJob; const jobFiveMinutes = require("./job.five-minutes"); const jobMondayMorning = require("./job.monday-morning"); var jobs = [ new CronJob({ cronTime: "00 */5 * * * *", //every five minutes onTick: function() { jobFiveMinutes(); }, start: false, //don't start immediately timeZone: 'America/Los_Angeles' }), new CronJob({ cronTime: "00 00 9 * * 1", //9 am Monday morning onTick: function() { jobMondayMorning(); }, start: false, timeZone: 'America/Los_Angeles' }), ]; jobs.forEach(function(job) { job.start(); //start the jobs }); 

上面,我们需要两个文件,并在两个cronjob中调用它们,以不同的间隔设置。 这些文件只是导出function:

 //job.five-minutes.js module.exports = function(){ console.log("runs every five minutes") }; //job.monday-morning.js module.exports = function(){ console.log("runs every monday morning at 9 am, Los Angeles time") }; 

无论您是在本地运行还是在远程服务器上运行,它都将按照传递的时区运行(虽然是可选的,但在几分钟内无关紧要)。

此外,重新启动服务器/脚本将不会影响其工作,因为它与系统时间同步。 一个"00 */5 * * * *"作业将在5的每个倍数上运行,即5,10,15,20等等。 所以,即使你在24点重启脚本,它也会以25而不是29来运行。

最后,该软件包已经扩展了cron语法,使其包含最左边的秒。 因此,你甚至可以知道你想要在什么时间运行这个工作。