在节点中设置date时间/定时器

假设我想设置一个定时服务来通过节点运行。 我真的会使用setTimeoutsetInterval来运行〜每分钟左右来检查时间是否匹配? 有没有更好的方法去做这件事?

更具体地说,我想build立一个给定时间的服务,当时它会发送一封电子邮件。

在伪代码中:

 setInterval(function(){ // using moment.js for time formatting var isItTime = new moment().format("HH:mm") === "04:00"; if( isItTime ) { sendEmail(); } }, 60 * 1000); 

有更好还是更标准化的方法?

我通常不推荐软件包,但是由于这是一个比较常见的模式,即search“node cron job”,我build议利用一个包来安排重复任务。 一个这样的例子是节点时间表 。

从文档中看到这个引用为什么我推荐它(重点是我的):

节点调度用于基于时间的调度,而不是基于时间间隔的调度。 虽然你可以很容易地按照自己的意愿去做,但是如果你只想做一些像“每5分钟运行一次这个函数”的东西,你会发现setInterval更容易使用,而且更合适。 但是,如果你想要“在每个月的第三个星期二每小时20和50秒运行这个函数”,你会发现Node Schedule更适合你的需求

你也可以使用。 如果你使用setTimeout,你可以这样做:

 function myFunction(){ //perform a check setTimeout(myFunction(), 60000); } 

更常见的做法是利用CRON作业。 在node中做一个好的库是node-cron( https://github.com/kelektiv/node-cron

使用像CRON这样的调度程序的一大优点是它是基于队列的,这意味着你的工作将更容易pipe理,因为它处理任务失败或退出并且必须重新启动的情况等等。

我build议这个npm cron 。 您可以设置任何function在指定的时间运行几周到几秒钟。 它使用cron语法,最左边加上“seconds”列。 以下是从官方文档configuration的一种方法:

 var CronJob = require('cron').CronJob; var job = new CronJob({ cronTime: '00 30 11 * * 1-5', onTick: function() { /* * Runs every weekday (Monday through Friday) * at 11:30:00 AM. It does not run on Saturday * or Sunday. */ }, start: false, timeZone: 'America/Los_Angeles' }); job.start(); 

对于你的情况每分钟cronTime将是:

 cronTime: '00 */1 * * * *' 

使用timeZone选项,您可以指示调度程序针对给定的时区运行作业。 在本地和联机运行节点脚本时,此function非常方便,因为脚本将在不同的时区一致运行。