在节点

时间:2017-07-24 18:29:53

标签: javascript node.js service

说我想设置定时服务以通过Node运行。我是否真的会每隔一分钟使用setTimeoutsetInterval来检查时间是否匹配?有没有更好的方法来解决这个问题?

更具体地说,我想建立一个服务,该服务给予一天的时间,此时它会发送电子邮件。

在伪代码中:

setInterval(function(){

    // using moment.js for time formatting
    var isItTime = new moment().format("HH:mm") === "04:00";

    if( isItTime ) {     
       sendEmail();
    }

}, 60 * 1000);

是否有更好或更标准化的方式?

4 个答案:

答案 0 :(得分:2)

我通常不会推荐软件包,但由于这是一种相对常见的模式,即搜索" node cron job",我建议利用软件包来安排重复任务。其中一个例子是node-schedule

请参阅文档中有关我推荐它的原因,(强调我的):

  

节点时间表用于基于时间的调度,而不是基于时间间隔的调度。虽然您可以轻松地将其弯曲到您的意愿,如果您只想做类似"每5分钟运行一次此功能",您会发现setInterval更容易使用,而且更合适。 但是,如果你想,比如说,"在每个月的第三个星期二的每小时20:和50运行此功能,"您会发现节点时间表更适合您的需求

答案 1 :(得分:1)

您可以使用其中之一。如果你使用了setTimeout,你可以这样做:

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

答案 2 :(得分:1)

更常见的方法是利用CRON作业。 在节点中执行此操作的好库是node-cron(https://github.com/kelektiv/node-cron

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

答案 3 :(得分:1)

我建议npm cron为此。您可以将任何功能设置为在指定的时间从几周到几秒运行。它使用cron语法,最左边添加“秒”列。以下是从官方文档配置的方法之一:

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选项,您可以指示调度程序根据给定的时区运行作业。在本地和在线运行节点脚本时,此功能非常方便,因为脚本将在不同时区一致地运行。