Firebase 在设定的时间后仅运行一次cron作业

Firebase 在设定的时间后仅运行一次cron作业,firebase,google-app-engine,google-cloud-firestore,google-cloud-functions,Firebase,Google App Engine,Google Cloud Firestore,Google Cloud Functions,我只需要运行一个cron作业,在设置的时间间隔后执行一个特定的云函数一次,但有点不确定如何执行。有没有办法通过当前的谷歌云平台做到这一点?根据下面的讨论通过评论进行更新: 如果要“在Firestore数据库中创建文档2小时后更改文档”,可以执行以下操作: 在Firestore中创建文档时,保存创建日期/时间,例如使用firebase.Firestore.FieldValue.serverTimestamp() 有一个HTTP云函数,您可以按照下面的说明定期调用(每分钟?每5分钟?),首先选择2小

我只需要运行一个cron作业,在设置的时间间隔后执行一个特定的云函数一次,但有点不确定如何执行。有没有办法通过当前的谷歌云平台做到这一点?

根据下面的讨论通过评论进行更新:

如果要“在Firestore数据库中创建文档2小时后更改文档”,可以执行以下操作:

  • 在Firestore中创建文档时,保存创建日期/时间,例如使用
    firebase.Firestore.FieldValue.serverTimestamp()
  • 有一个HTTP云函数,您可以按照下面的说明定期调用(每分钟?每5分钟?),首先选择2小时前创建的文档(基于保存的时间戳),然后对这些文档执行所需的操作

  • 如果您想通过cron作业触发云函数,请注意,您通常会通过HTTP云函数触发,通过cron作业调用云函数URL

    您可以使用外部服务,如或使用GCP的应用程序引擎和云发布/订阅

    请看此视频:

    这篇博文:

    都是来自Firebase团队



    最后请注意,GCP最近推出了一款新产品,可用于调用HTTP云功能。

    很抱歉回答得太晚。曾几何时,我也被这个问题困扰着。您确实可以在特定时间安排执行一次作业。但是,您必须使用多个平台,因为Firebase云功能对cron任务有时间限制。如果您查看,您可以看到Firebase云函数设置了时间限制,直到它们被取消为止(540秒或9分钟)。因此,您不能使用云函数对9分钟后执行的作业进行cron。但您可以使用服务器来cron作业,而无需付费。不幸的是,如果在整个时间间隔内没有任务,Heroku应用程序会在30分钟后休眠。但是,您可以使用外部服务器保持清醒,例如。你可以在30分钟内每分钟对Heroku应用程序应用ping,从而无限制地唤醒你的应用程序。您可以使用以下代码来cron一个始终执行一次的作业:

    const schedule = require('node-schedule');
    const date = new Date(2012, 11, 21, 5, 30, 0);
    
    const job = schedule.scheduleJob(date, function(){
      console.log('The world is going to end today.');
    });
    
    您可以获取Firestore的当前时间或时间戳,并根据需要将时间间隔添加到当前日期。别忘了使用时区。您可以使用规则设置时区,如下所示:

      const rule = new schedule.RecurrenceRule();
      rule.dayOfWeek = [0, new schedule.Range(0, 6)];  //all days
      rule.hour = req.body.hour;
      rule.minute = req.body.minute;
      rule.second = req.body.second;
      rule.tz = "Europe/Istanbul"; // You can specify a timezone!
    
    const job = schedule.scheduleJob(rule, function(data) {
        console.log("Job ran @", new Date().toString());
      }.bind(null, dataFuture));
    
    在这里,您可以通过从用户获取时间规范从客户端获取请求。并使用schedule job模块执行一次任务,如下所示:

      const rule = new schedule.RecurrenceRule();
      rule.dayOfWeek = [0, new schedule.Range(0, 6)];  //all days
      rule.hour = req.body.hour;
      rule.minute = req.body.minute;
      rule.second = req.body.second;
      rule.tz = "Europe/Istanbul"; // You can specify a timezone!
    
    const job = schedule.scheduleJob(rule, function(data) {
        console.log("Job ran @", new Date().toString());
      }.bind(null, dataFuture));
    
    在这里,您可以将用户数据与
    .bind()
    一起使用,方法是输入变量,就像
    dataFuture
    variable一样。如果您的用户使用本机android平台,您可以通过输入
    hour\u of_day
    minute
    指定时间间隔,如下所示:

    Date currentTime = Calendar.getInstance().getTime();
    Locale aLocale = Locale.forLanguageTag("tr-TR");
    Calendar calendar = Calendar.getInstance(aLocale);                                                
    calendar.setTime(currentTime);
    calendar.add(Calendar.MINUTE, 1);                                                       
    calendar.add(Calendar.HOUR_OF_DAY, 4);
    

    或者,您可以使用平台。但是它可能有点难用。

    视频集中在定时定时定期发生的cron任务上。我想问的是,是否有一种方法可以在事件发生后的某个时间触发一次任务哪种“事件”?Firestore中的事件?Firestore中的onCreate触发器。基本上,在生成一个文档之后,我想触发另一个函数来更改数据库中的文档。我以前是通过一个函数(通过异步等待)来完成的,但是超时时间只有9分钟,我需要它在2小时后执行一些操作,所以我知道你想在Firestore中发生事件两小时后触发一个云函数。是吗?嗯,我不确定这是不是正确的方法,但是是的。我想在firestore中创建文档2小时后更改该文档