【问题标题】:Implementation of Distributed-Counter-Extension for local emulator本地模拟器分布式计数器扩展的实现
【发布时间】:2022-01-25 01:55:51
【问题描述】:

distributed counter 的 firebase 扩展可以直接安装到云端并且运行良好。要为应用开发新功能,我需要在模拟器上执行此操作,以免中断正在运行的服务器。

由于 firebase 扩展只是 cloud Functions*,因此我考虑通过从扩展本身获取 source code 在我的模拟器中实现云功能。到目前为止,这适用于其他扩展...

实施时的错误和故障

在实现 javaScript 版本时,我收到以下错误:

function ignored because the unknown emulator does not exist or is not running.

可以通过重写index.jsfunctions 的导出行来解决这个问题,但无论如何都不会提供扩展的预期功能:

exports.worker = functions.handler.firestore.document.onWrite(async (change, context) => {...});

exports.worker = functions.firestore.document("").onWrite(async (change, context) => {...});

问题

我缺少一些实现还是缺少模拟器?如何实现这个 Firestore 扩展?

一些类似的问题,但不真正谈论整个扩展的实现:

【问题讨论】:

  • 仅供参考,正在积极开发模拟器对扩展的支持 :)

标签: firebase google-cloud-firestore google-cloud-functions firebase-tools


【解决方案1】:

firebaser 在这里

Firebase 扩展通常在 extension.yaml 文件中声明其触发器,而不是在代码本身中。因此,为了以这种方式模拟扩展,您需要将触发器移至代码中。

对于“worker”函数的具体示例,扩展程序声明了要收听的文档here,因此我们将把文档复制到代码中:

exports.worker = functions.firestore.document(`${process.env.INTERNAL_STATE_PATH}/workers/{workerId}`).onWrite(async (change, context) => {...});

您必须对扩展中的其他后台触发函数执行相同操作 - 在 extension.yaml 中找到触发器,并将其移至代码中。

您还需要提供通常用于配置扩展的参数值作为环境变量。为此,您必须将.env 文件添加到包含您要设置的环境变量的函数目录。对于您的情况,这将类似于:

LOCATION=//Put your location here
INTERNAL_STATE_PATH=//Put your path here
SCHEDULE_FREQUENCY=1

然后,您需要启用模拟器来读取此文件:

firebase --open-sesame dotenv

然后,你应该可以在模拟器中运行扩展代码了。

您可能会想,目前这不是一个非常容易的过程。我们目前正在努力为 Firebase Emulator Suite 添加对 Extensions 的原生支持。一旦可用,我将确保回到这里并更新此答案并说明如何使用它,希望这对您来说会容易得多!

PS:如果您有兴趣帮助我们尽早测试此功能,请告诉我,我们会在准备好测试后立即与您联系。

【讨论】:

  • 抱歉回复晚了。我试图实现它,但我担心这样的东西是否真的能够在模拟器中作为scheduled functions are not available 工作,对吗?我指的是:index.js 中的exports.controllerCore = functions.pubsub.schedule(`every ${path} minutes`).onRun() 行。
  • 我能够通过firebase shell 运行预定的函数,它适用于第一个聚合。下一个将抛出Transaction to aggregate shards failed. TypeError: Cannot read properties of undefined (reading 'length')\n at /Users/**/Documents/**/**-Backend/functions/internal/counter/controller.js:118:44\n 。从本地 Firestore 中删除 _firebase_ext_ 时,它将再次为一个聚合工作。
  • 原来初始化工作数组时出错。我已经添加了几行并将一个 Github 错误 report 向上,其中进一步描述了模拟器代码中的更改。
猜你喜欢
  • 2020-10-11
  • 2018-12-23
  • 2020-12-07
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
  • 2016-10-14
相关资源
最近更新 更多