如何基于数据库模拟器更新使Firebase功能模拟器触发

时间:2020-02-07 00:20:32

标签: firebase firebase-realtime-database google-cloud-functions firebase-tools

简而言之,我想在本地测试Firebase function,特别是从realtime database trigger触发的测试。根据{{​​3}},看来有两种方法可以完成Firebase功能的本地测试:

  • 使用firebase函数模拟器(else
  • 使用firebase函数外壳程序(firebase emulators:start --only functions

首先,至少在链接的指南中,两者之间的区别非常不清楚。对于Firebase人士而言,这里的文档更新非常棒(考虑对这些内容进行本地测试是非常重要的功能)。

我对这个问题的关注(相对于我尝试过的)基于模拟器,即因为提到了“ the docs for local testing”。有趣的是,该列表仅包含两项:

  • Cloud Firestore
  • Firebase托管

实时数据库有一个显着的遗漏,也许就是差距所在,但是我们开始吧。

我的函数看起来像这样:

firebase functions:shell

在我的项目中,我同时使用了函数和实时数据库,因此我运行命令console.log("Hello World") exports.myDatabaseTrigger = functions.database.ref('/a/path/{id}').onCreate((data, context) => { console.log(`myDatabaseTrigger triggered - here's my path ${data.ref.path}`); //manipulate some other stuff in the DB }) ,它将启动两个模拟器。

在邮递员中,我使用本地interactions with other services通过以下参数发布一些数据:

firebase emulators:start

然后我返回一个响应,其中包含POST http://localhost:9000/a/path.json { "some": "data" } 下新创建的项的名称。但是,我的Firebase函数从不触发,也从不看到内部日志(尽管在仿真器启动时确实会打印/a/path日志)。

那么,这两个模拟器之间的交互可能吗?还是我被迫使用功能外壳?关于shell的问题是,基于Realtime Database REST API,如果我简单地使用某个随机值(例如{{1})调用函数,则不清楚DataSnapshot变量(即Hello World)是什么。 }。

1 个答案:

答案 0 :(得分:6)

您似乎刚刚忘记了项目/名称空间ID。

尝试将?ns=参数添加到POST:

POST
http://localhost:9000/a/path.json?ns="YOUR_PROJECT_ID"
{
  "some": "data"
}

仅在生产中,仿真功能从写入单个数据库实例的操作触发。

关于您的困惑点:

  • functions:shell只是功能的REPL。它不会模拟任何其他服务(数据库,Firestore等)。相反,您直接传递来自这些服务的数据。
  • 如果要测试功能<->数据库交互,请使用emulators:start --only database,functions
  • 通常,emulators:start的规则是我们全面模拟正在运行的任何内容。因此,例如,如果您正在运行“函数和数据库”模拟器,则所有来自函数的写入(通过admin.database()....都将被重定向到数据库模拟器。但是对Firestore(admin.firestore()...)的写入将尝试并影响生产,因为该模拟器未运行。