简而言之,我想在本地测试Firebase function,特别是从realtime database trigger触发的测试。根据{{3}},看来有两种方法可以完成Firebase功能的本地测试:
else
)firebase emulators:start --only functions
)首先,至少在链接的指南中,两者之间的区别非常不清楚。对于Firebase人士而言,这里的文档更新非常棒(考虑对这些内容进行本地测试是非常重要的功能)。
我对这个问题的关注(相对于我尝试过的)基于模拟器,即因为提到了“ the docs for local testing”。有趣的是,该列表仅包含两项:
实时数据库有一个显着的遗漏,也许就是差距所在,但是我们开始吧。
我的函数看起来像这样:
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
)是什么。 }。
答案 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()...
)的写入将尝试并影响生产,因为该模拟器未运行。