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` 是啥?

应用服务计划的 Azure 函数应用超时

如何处理 Firebase Cloud Functions 中的错误 JSON?

Wordpress主题文件夹中的functions.php作用说明