Functions Emulators 中的 DataSnapshot.ref 仅指向默认数据库
Posted
技术标签:
【中文标题】Functions Emulators 中的 DataSnapshot.ref 仅指向默认数据库【英文标题】:DataSnapshot.ref in Functions Emulators only points to default database 【发布时间】:2022-01-04 09:10:19 【问题描述】:假设我在名为“test”的辅助实时数据库中有一个节点,其值为“foobar”。 我想设置一个防止它被删除的功能。更现实地,这个节点会有几个子节点,函数首先检查它是否可以被删除。但是,在这里我们永远不允许删除它以保持代码尽可能短。 所以我添加了一个触发 onDelete 的函数,只是重写了值。
简而言之:
二级数据库有:"test":"foobar"
onDelete 函数:
exports.testDelete = functions.database
.instance("secondary")
.ref("test")
.onDelete(async (snap, context) =>
await snap.ref.set(snap.val());
);
使用模拟器运行此程序时,我希望当我删除节点时,该节点会重新出现在辅助数据库中,这就是部署到生产环境时发生的情况。在模拟器中,节点重新出现,但出现在主数据库而不是辅助数据库中。我看到解决此问题的唯一方法是将snap.ref.set(snap.val())
替换为admin.app().database("https://secondarydatabasedomain.firebasedatabase.app").ref().child("test").set(snap.val())
,这看起来有点麻烦,只是为了让模拟器工作。
我在这里做错了吗?
我使用的是节点 14 和 firebase CLI 版本 9.23.0
【问题讨论】:
这似乎是一个参考问题..这个问题解决了吗? 不幸的是它没有解决,使用最新的 firebase-tools 版本 9.23.1 发表了答案,有用吗? 【参考方案1】:指定实例和路径:
你已经遵循了语法:
名为“my-app-db-2”的实例:functions.database.instance('my-app-db-2').ref('/foo/bar')
您提到了实例名称,否则它将重定向到默认数据库,因此语法似乎正确。
要触发事件数据,请遵循以下语法:
onDelete(handler: (snapshot: DataSnapshot, context: EventContext) => any): CloudFunction
例如可以参考Documentation:
// Listens for new messages added to /messages/:pushId/original and creates an // uppercase version of the message to /messages/:pushId/uppercase exports.makeUppercase = functions.database.ref('/messages/pushId/original') .onCreate((snapshot, context) => // Grab the current value of what was written to the Realtime Database. const original = snapshot.val(); functions.logger.log('Uppercasing', context.params.pushId, original); const uppercase = original.toUpperCase(); // You must return a Promise when performing asynchronous tasks inside a Functions such as // writing to the Firebase Realtime Database. // Setting an "uppercase" sibling in the Realtime Database returns a Promise. return snapshot.ref.parent.child('uppercase').set(uppercase); );
如果上述所有语法均已正确遵循,那么我建议您在 repo 上报告一个错误,并包括 Frank 在类似的 scenario 中提到的整个云功能。
【讨论】:
谢谢,我确实仔细检查了语法的正确性。我在 #3961 号下的 repo 上将它变成了一个问题 希望以上回答对您有所帮助。以上是关于Functions Emulators 中的 DataSnapshot.ref 仅指向默认数据库的主要内容,如果未能解决你的问题,请参考以下文章
关于adb使用时no devices/emulators found
Android Studio遇到了“No USB devices or running emulators detected”
functions.h 中的 `#ifndef FUNCTIONS_H` 是啥?