【问题标题】:How do I setup firebase realtime DB triggers for multiple databases using cloud functions?如何使用云功能为多个数据库设置 firebase 实时数据库触发器?
【发布时间】:2019-12-04 08:34:44
【问题描述】:

我有一个特定的用例,我在一个项目上有多个实时数据库(这个数字会增加),我想在所有这些数据库上设置云函数触发器,目前我希望有办法在触发云函数的回调中获取数据库名称?

import * as functions from 'firebase-functions';
import mongoose from 'mongoose';


export const updateData = functions.database.ref('/someendpoint/{code}').onUpdate(async (change, context) => {
    $dbName = getFireBaseDBName(); //some function to get the DB name - This is the step that I would like to know how
    await mongoose.connect(`mongo-db-string-connection/${dbName}`, {useNewUrlParser: true});

    const Code = context.params.code;
    const Schema = new mongoose.Schema({}, { collection: `someendpoint`, strict: false });
    const Model = mongoose.model(`someendpoint`, Schema);

    const after = change.after.val();
    await Model.deleteMany({code: Code});
    await Model.create({after, ...{code:Code}});
});

我需要数据库名称,以便我可以在 Mongo 上保存到同名的数据库。

例如: 鉴于我有一个 firebase 项目 'My-Project' 并且我有多个实时数据库实例说: 'db1'、'db2'、'db3' 当触发器触发时,我想保存/更新/删除 MongoDB 数据库中的数据,以便它与我的 Firebase 实时数据库保持同步。

因此,不仅要获取存储在 db1 中的数据,还要获取名称“db1”,以便在 Mongo 中更改正确的数据,这一点至关重要.

请记住,更多的数据库将被添加到 My-Project 所以 在某个地方,它将是'db100

【问题讨论】:

  • 您是说在一个项目中有多个数据库分片,并且您想要所有这些分片的侦听器吗?或者您是说您有多个项目,并且您希望每个项目中的数据库都有侦听器?如果您编辑问题以通过示例说明您希望在函数中收到的数据,将会很有帮助。
  • 我在一个项目中有多个数据库实例,这是一个多租户应用程序,每个租户都有自己的数据库。

标签: firebase firebase-realtime-database google-cloud-functions


【解决方案1】:

第一件事 - 我要说的是,您将数据库分片用于多租户的方式并不是它们的真正用途。 Firebase 团队推荐using separate projects for multi-tenancy,每个租户一个,以保持用户及其数据的隔离。数据库分片存在的原因是为了帮助开发人员应对实时数据库的扩展限制。

话虽如此,实时数据库的触发器并不直接在回调中提供分片的名称。您需要根据 API 的要求为每个分片编写一个函数,并在 documentation 中进行了描述。

要控制函数应该触发的时间和地点,请调用 ref(path) 指定一个路径,并且可以选择指定一个数据库实例 实例('INSTANCE_NAME')。如果您不指定实例,则 函数部署到 Firebase 的默认数据库实例 项目例如:

  • 默认数据库实例:functions.database.ref('/foo/bar')
  • 名为“my-app-db-2”的实例:functions.database.instance('my-app-db-2').ref('/foo/bar')

由于您必须在函数代码中硬编码分片的名称,您不妨在函数本身中再次键入它。或者将它们放在全局变量中,并在每个函数中使用它们。

如果您想查看如何在为每个实例声明的每个函数之间共享代码的示例,请阅读另一个问题:How to trigger firebase function on all database instances rather than default one?

【讨论】:

  • 我想写这么多云函数不太现实,我可能不得不考虑其他方法。关于多租户,我有多个租户,但它仍然是一个应用程序,对数据库的任何访问都基于授权和代码逻辑(根据登录的租户访问租户的数据库)并且它可以工作,我是新手firebase 所以我将不得不阅读更多关于这个的内容,以便从安全的角度真正理解它,谢谢你在这里指导我,我一定会更多地研究这个。
  • 如果您觉得此答案有帮助,请将其标记为正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-18
  • 2018-11-21
  • 2020-05-15
  • 2018-11-06
  • 1970-01-01
  • 1970-01-01
  • 2019-09-20
相关资源
最近更新 更多