如何使用pubsub模拟器在本地调用firebase Schedule函数

r6l8ljro  于 2023-01-27  发布在  其他
关注(0)|答案(4)|浏览(151)

我正在研究云计算功能,特别是调度功能。我需要每5分钟定期触发一个功能,但只有测试步骤。我需要运行它的pubsub模拟器没有部署它。
怎么做呢?
我试过用 Firebase 弹,但只触发了一次

exports.scheduledFunctionPlainEnglish =functions.pubsub.schedule('every 2 minutes')
 .onRun((context) => {
    functions.logger.log("this runs every 2 minutes")
    return null;
})
3npbholx

3npbholx1#

计划的函数被加载到Cloud Functions模拟器运行时,并绑定到PubSub模拟器主题。
但正如@samstern所说(https://github.com/firebase/firebase-tools/issues/2034):
你就得用发布订阅消息手动触发它们。
你可以这样做:

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
import { PubSub } from '@google-cloud/pubsub';

if (!admin.apps.length) {
  admin.initializeApp();
}

const pubsub = new PubSub({
  apiEndpoint: 'localhost:8085' // Change it to your PubSub emulator address and port
});

setInterval(() => {
  const SCHEDULED_FUNCTION_TOPIC = 'firebase-schedule-yourFunctionName';
  console.log(`Trigger sheduled function via PubSub topic: ${SCHEDULED_FUNCTION_TOPIC}`);
  const msg = await pubsub.topic(SCHEDULED_FUNCTION_TOPIC).publishJSON({
    foo: 'bar',
  }, { attr1: 'value1' });
}, 5 * 60 * 1000); // every 5 minutes

关于这个概念的其他信息(感谢@kthaas):

  1. www.example.com https://github.com/firebase/firebase-tools/pull/2011/files#diff-6b2a373d8dc24c4074ee623d433662831cadc7c178373fb957c06bc12c44ba7b
  2. www.example.com https://github.com/firebase/firebase-tools/pull/2011/files#diff-73f0f0ab73ffbf988f109e0a4c8b3b8a793f30ef33929928a892d605f0f0cc1f
eufgjt7s

eufgjt7s2#

正如你所说,你可以使用firebase shell运行你的函数一次,并且在firebase shell中,你可以使用NodeJS命令。

使用设置间隔

firebase functions:shell中,使用setInterval每2分钟运行一次函数。

user@laptop:~$ firebase functions:shell

✔  functions: functions emulator started at http://localhost:5000
i  functions: Loaded functions: myScheduledFunction
firebase > setInterval(() => myScheduledFunction(), 120000)

> this runs every 2 minutes

单行脚本

从firebase-tools版本8.4.3开始,尤其是this PR,管道解决方案不再起作用。
在Bash中,您甚至可以通过管道将setInterval命令传输到firebase shell

user@laptop:~$ echo "setInterval(() => myScheduledFunction(), 120000)" | firebase functions:shell
wz1wpwve

wz1wpwve3#

对于那些在2023年看到这个的人来说,它仍然不受支持。
我的解决方案是将functions.pubsub.schedule中执行"工作"的代码抽象到它们自己的函数中,然后创建一个单独的文件(我将其添加到了functions文件夹的顶部),其中包含setInterval,该文件将触发前面提到的抽象函数。
例如,在代码中的某个地方:

exports.myScheduledFunctionCode = () => {
  console.log('why, hello there interval');
}

/functions目录顶部的timers.js(例如)文件中:

setInterval(() => {
  myScheduledFunctionCode();
}, 60000);

然后,你可以启动你的Firebase Emulator套件。在另一个终端会话中,只运行一个普通的$ node functions/timers.js。现在你预定的函数代码正在运行,你的整个模拟器套件也在运行。
希望这对某人有帮助!

zte4gxcn

zte4gxcn4#

当前不支持调度函数。documentation声明:
使用shell,您可以模拟数据并执行函数调用,以模拟与Emulator Suite当前不支持的产品的交互:存储、PubSub、分析、远程配置、存储、身份验证和崩溃分析。
计划函数是pubsub触发器的不受支持的扩展。
请随意file a feature request with Firebase support

相关问题