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

IT技术 javascript firebase google-cloud-functions google-cloud-pubsub
2021-03-14 07:33:01

我正在研究云功能,尤其是计划功能。我需要每 5 分钟定期触发一个函数,但仅在测试步骤中。我需要在 pubsub 模拟器上运行它而不部署它。

怎么做?

我尝试使用 firebase shell,但它只触发了一次

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

计划函数被加载到 Cloud Functions 模拟器运行时并绑定到 PubSub 模拟器主题。

但正如@samstern 所说(https://github.com/firebase/firebase-tools/issues/2034):

您必须使用 Pub/Sub 消息手动触发它们。

你可以这样做:

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. https://github.com/firebase/firebase-tools/pull/2011/files#diff-6b2a373d8dc24c4074ee623d433662831cadc7c178373fb957c06bc12c44ba7b
  2. https://github.com/firebase/firebase-tools/pull/2011/files#diff-73f0f0ab73ffbf988f109e0a4c8b3b8a793f30ef33929928a892d605f0f0cc1f
@Stephan 我添加apiEndpoint到 PubSub 初始化中。除了指定的projectId我用env-cmd.env含有链接到默认的凭证文件GOOGLE_APPLICATION_CREDENTIALS=./default-credentials.json
2021-05-15 07:33:01
这怎么在我之前没有任何选票?这工作得很好!我使用从您的答案中借用的代码创建了一个 js 文件(而不是 ts 文件,不必担心编译它),并手动触发任务,而不是像这样的间隔:node functions/src/myTriggerfile.js
2021-05-16 07:33:01
为了完整起见,还有两件事要使此代码片段起作用。首先,必须将PUBSUB_EMULATOR_HOSTenv 变量设置为类似localhost:8432(取决于您的本地模拟器设置)。其次,项目 id 必须提供给 PubSub 构造函数(例如new PubSub({ projectId: '...' })
2021-05-20 07:33:01

正如您所说,您可以使用 firebase shell 运行一次您的功能。在 firebase shell 中,您可以使用 NodeJS 命令。

使用 setInterval

在里面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 版以来,尤其是此 PR,管道解决方案不再起作用。

在 Bash 中,您甚至可以将setInterval命令通过管道传输到 firebase shell

user@laptop:~$ echo "setInterval(() => myScheduledFunction(), 120000)" | firebase functions:shell
为了澄清起见,您的意思是连接到外壳的单线管道不起作用?(然后可以从答案中编辑?)我正在使用 fireabse-tools9.16.0setInterval(在 shell 中以交互方式运行对我有用
2021-04-30 07:33:01
自 firebase-tools 8.4.3 版以来,尤其是此 PR,此解决方案不再有效。
2021-05-12 07:33:01

目前不支持预定功能。文件规定:

使用 shell,您可以模拟数据并执行函数调用以模拟与 Emulator Suite 当前不支持的产品的交互:Storage、PubSub、Analytics、Remote Config、Storage、Auth 和 Crashlytics。

预定函数是 pubsub 触发器不受支持的扩展。

请随时向Firebase 支持提交功能请求

这是GitHub 上未解决问题
2021-04-28 07:33:01