首页 > 解决方案 > 使用 onRequest 云函数参数中的调度表达式调度 cron 作业

问题描述

functions.pubsub.schedule在云函数 ( ) 中保留 cron 作业发布/订阅函数 ( functions.https.OnRequest) 并导出它,不会执行。

一个完整的例子如下:

export const sayHelloWhen = functions.https.onRequest((request, response) => {
    cors(request, response,  () => {
        const scheduleExpression = request.body.data.scheduleExpression;
        functions.logger.log(`Called sayHelloWhen with ${scheduleExpression}`);
        functions.pubsub.schedule(scheduleExpression).onRun((context) => {
            functions.logger.log(`Executed sayHelloWhen with ${scheduleExpression}`)
        });
        response.send({
            status: "success",
            data: `scheduled at ${scheduleExpression}`
        })
    })
})

问题是发布/订阅不会触发。执行其他代码。

我想让 HTTP 请求正文scheduleExpression带入pubsub.schedule's 参数。我不想在玉米作业中使用静态计划表达式。

在客户端,我想在客户端定义一个调度表达式,如下所示:

function scheduleFunction() {
  const functions = getFunctions();
  const sayHello = httpsCallable(functions, "sayHelloWhen");
  sayHello({ scheduleExpression: "every 1 minute" }).then((result) => {
    // const data = result.data;
    console.log("Result:", result);
  });
}

下面的示例仅适用于静态计划表达式,这意味着云函数本身具有固定的计划表达式:

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

它可以导出为 cron 作业触发器并执行。

但是像第一个代码示例一样,在云函数中保留 pub/sub cron 作业函数onRequest不会执行。

标签: firebasegoogle-cloud-platformcrongoogle-cloud-functions

解决方案


我认为您正在尝试做的事情非常有趣,但我想指出您缺少一些可能导致您的应用程序无法按照您需要的方式执行的步骤。

首先,您需要终止您的 HTTP 函数

send()始终以、redirect()或结束 HTTP 函数end()。否则,您的函数可能会继续运行并被系统强制终止。另请参阅同步、异步和承诺

当您不终止它们时,您可能会进入更深的层次,除非前面的代码完成,否则下面的代码将不会执行。我还想说我还没有找到任何像你这样具有嵌套函数的应用程序。


Sync、async 和 Promise页面中,您可以找到一个非常解释性的视频来了解函数的生命周期,并且在 Promise 如何与函数一起工作部分中,我们有:

当您将 JavaScript 承诺返回给函数时,该函数将继续运行,直到承诺被解决或拒绝。为了表明一个函数已经成功完成了它的工作,promise 应该被解析。为了指示错误,应拒绝该承诺。这意味着您只需要处理您想要的错误。

除此之外,我建议使用单独的文件来组织多个函数以获得更有条理的代码,但这只是一个建议,并不是真正必要的。


最后,我关心的是scheduledExpression参数,我想如果以上都不起作用,你可能想检查并分享这个值是什么。


推荐阅读