按时触发 Firebase 的云功能?

我正在寻找一种方法来安排 Firebase 的云函数,或者换句话说,在特定的时间触发它们。

56551 次浏览

更新 2019-04-18

现在有一种非常简单的方法,可以通过 Firebase 将预定的代码部署到云函数上。

您可以使用简单的文本语法:

export scheduledFunctionPlainEnglish =
functions.pubsub.schedule('every 5 minutes').onRun((context) => {
console.log('This will be run every 5 minutes!');
})

或者更灵活的 cron 表格式:

export scheduledFunctionCrontab =
functions.pubsub.schedule('5 11 * * *').onRun((context) => {
console.log('This will be run every day at 11:05 AM UTC!');
});

要了解更多信息,请参见:

Note that your project needs to be on a Blaze plan for this to work, so I'm leaving the alternative options below for reference.

If you want to schedule a single invocation of a Cloud Function on a delay from within the execution of another trigger, you can use 云计算任务 to set that up. 读读这篇文章 for an extended example of how that can work.

原始答案如下..。


目前还没有内置的 runat/cron 类型触发器。

目前,最好的选择是使用外部服务定期触发 HTTP 函数。有关更多信息,请参见 函数-样本回收中的示例。或者使用最近推出的 Google Cloud Scheduler 通过 PubSub 或 HTTPS 触发云功能:

enter image description here

我也强烈推荐阅读 Firebase 博客上的这篇文章: 如何为 Firebase 调度具有云功能的(Cron)作业和这个视频: Timing Cloud Functions for Firebase using an HTTP Trigger and Cron

最后一个链接使用 Cron-job.org触发云函数,并且适用于免费计划中的项目。注意,这允许任何人在未经授权的情况下调用您的函数,因此您可能希望在代码本身中包含一些滥用保护机制。

您可以做的是旋转由 cron 作业触发并发送到 PubSub 的 AppEngine 实例。我写了一篇关于这个的博文,你可能想看看:

Https://mhaligowski.github.io/blog/2017/05/25/scheduled-cloud-function-execution.html

It is important to first note that the default timezone your functions will execute on is 美国/洛杉矶 according to the 文件. You may find a list of timezones here if you'd like to trigger your function(s) on a different timezone.

注意! : 这里有一个有用的网站来帮助 cron table formats(我发现它非常有用)

你应该这么做: (假设您想使用 非洲/约翰内斯堡作为您的时区)

export const executeFunction = functions.pubsub.schedule("10 23 * * *")
.timeZone('Africa/Johannesburg').onRun(() => {
console.log("successfully executed at 23:10 Johannesburg Time!!");
});

否则,如果你宁愿坚持默认设置:

export const executeFunction = functions.pubsub.schedule("10 23 * * *")
.onRun(() => {
console.log("successfully executed at 23:10 Los Angeles Time!!");
});