Man*_*ndM 4 firebase firebase-tools firebase-realtime-database google-cloud-functions
简而言之,我想在本地测试Firebase 功能,特别是从实时数据库 trigger 触发的功能。根据本地测试的文档,似乎有两种方法可以完成 Firebase 功能的本地测试:
firebase emulators:start --only functions)firebase functions:shell)首先,至少在链接指南中,两者之间的差异非常不清楚。对于阅读本文的 Firebase 人员来说,此处的文档更新会很棒(考虑到对这些内容的本地测试是如此重要的功能)。
我对这个问题的关注(关于我尝试过的)是基于模拟器的,即因为它提到了“与其他服务的交互”。有趣的是,那里的列表只包括两个项目:
实时数据库有一个明显的遗漏,也许这就是差距所在,但我们走了。
我的函数看起来像这样:
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
})
Run Code Online (Sandbox Code Playgroud)
在我的项目中,我同时使用函数和实时数据库,所以我运行命令firebase emulators:start并启动两个模拟器。
在 Postman 中,我使用本地实时数据库 REST API使用以下参数发布一些数据:
POST
http://localhost:9000/a/path.json
{
"some": "data"
}
Run Code Online (Sandbox Code Playgroud)
然后我得到一个包含新创建项目名称的响应/a/path。但是,我的 Firebase 函数永远不会触发,而且我永远不会看到内部日志(尽管Hello World在模拟器启动时会打印日志)。
那么,这两个模拟器之间可以交互吗?或者,我是否被迫使用功能外壳?我对 shell 的问题是,根据实时数据库示例,data.ref.path如果我只是用一些随机值(例如myDatabaseTrigger({"some": "data"}))调用我的函数,则不清楚 DataSnapshot 变量(即)是什么。
看起来您可能刚刚忘记了项目/命名空间 ID。
尝试将?ns=参数添加到您的 POST:
POST
http://localhost:9000/a/path.json?ns="YOUR_PROJECT_ID"
{
"some": "data"
}
Run Code Online (Sandbox Code Playgroud)
模拟函数仅从写入单个数据库实例时触发,就像在生产中一样。
至于你的困惑点:
functions:shell只是函数的 REPL。它不模拟任何其他服务(数据库、Firestore 等)。相反,您直接传入来自这些服务的数据。emulators:start --only database,functionsemulators:start是我们全面模拟正在运行的任何东西。因此,例如,如果您正在运行函数和数据库模拟器,则所有来自函数的写入(通过admin.database()....将被重定向到数据库模拟器。但写入 Firestore ( admin.firestore()...) 将尝试命中生产,因为该模拟器未运行。| 归档时间: |
|
| 查看次数: |
2357 次 |
| 最近记录: |