【问题标题】:DataSnapshot.ref in Functions Emulators only points to default databaseFunctions Emulators 中的 DataSnapshot.ref 仅指向默认数据库
【发布时间】: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
  • 发表了答案,有用吗?

标签: node.js firebase firebase-realtime-database google-cloud-functions firebase-tools


【解决方案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 上将它变成了一个问题
  • 希望以上回答对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 2010-09-25
  • 2018-12-10
  • 1970-01-01
  • 2015-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多