如何使用云函数为多个数据库设置firebase实时数据库触发器?

如何使用云函数为多个数据库设置firebase实时数据库触发器?,firebase,firebase-realtime-database,google-cloud-functions,Firebase,Firebase Realtime Database,Google Cloud Functions,我有一个特定的用例,我在一个项目上有多个实时DBs(这个数字会增加),我想在所有项目上设置云函数触发器,目前我希望是否有办法在触发云函数的回调中获取DB名称 import * as functions from 'firebase-functions'; import mongoose from 'mongoose'; export const updateData = functions.database.ref('/someendpoint/{code}').onUpdate(async

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

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项目“我的项目”,并且我有多个实时数据库实例,比如: “db1”、“db2”、“db3” 触发触发器时,我希望保存/更新/删除MongoDB数据库中的数据,以便它与我的Firebase实时数据库保持同步

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

请记住,更多的数据库将添加到我的项目中
接下来的某个地方,它将是“db100

第一件事-我要说的是,您使用数据库碎片进行多租户的方式并不是它们真正应该使用的方式。Firebase团队建议,每个租户一个,以保持用户及其数据的隔离。数据库碎片的存在是为了帮助开发人员处理实时数据库的扩展限制

尽管如此,Realtime数据库的触发器并没有在回调中直接提供碎片的名称。根据API的要求,需要为每个碎片编写一个函数,如中所述

要控制函数应在何时何地触发,请调用ref(path) 指定路径,并可以选择使用指定数据库实例 实例('instance_NAME')。如果未指定实例,则 函数部署到Firebase的默认数据库实例 项目,例如:

  • 默认数据库实例:functions.database.ref('/foo/bar')
  • 名为“my-app-db-2”的实例:functions.database.Instance('my-app-db-2').ref('/foo/bar'))
由于您必须在函数代码中硬编码碎片的名称,因此您最好在函数本身中再次键入它。或者将它们放在全局变量中,并在每个函数中使用它们


如果您想了解如何在为每个实例声明的每个函数之间共享代码的示例,请阅读另一个问题:

首先,我要说的是,您使用数据库碎片进行多租户的方式实际上并不是它们应该使用的方式。Firebase团队建议,每个租户一个,以保持用户及其数据的隔离。数据库碎片的存在是为了帮助开发人员处理实时数据库的扩展限制

尽管如此,Realtime数据库的触发器并没有在回调中直接提供碎片的名称。根据API的要求,需要为每个碎片编写一个函数,如中所述

要控制函数应在何时何地触发,请调用ref(path) 指定路径,并可以选择使用指定数据库实例 实例('instance_NAME')。如果未指定实例,则 函数部署到Firebase的默认数据库实例 项目,例如:

  • 默认数据库实例:functions.database.ref('/foo/bar')
  • 名为“my-app-db-2”的实例:functions.database.Instance('my-app-db-2').ref('/foo/bar'))
由于您必须在函数代码中硬编码碎片的名称,因此您最好在函数本身中再次键入它。或者将它们放在全局变量中,并在每个函数中使用它们


如果您想查看如何在为每个实例声明的每个函数之间共享代码的示例,请阅读另一个问题:

您是说您在一个项目中有多个数据库碎片,并且希望所有这些碎片上都有侦听器吗?或者您是说您有多个项目,并且希望每个项目中的数据库都有侦听器?如果您编辑问题以举例说明您希望在功能中接收的数据,这将非常有用。我在一个项目中有多个数据库实例,这是一个多租户应用程序,每个租户都有自己的数据库。您是说在一个项目中有多个数据库碎片,你想让所有人都听吗?或者您是说您有多个项目,并且希望每个项目中的数据库都有侦听器?如果您编辑问题,以举例说明您希望在函数中接收的数据,这将非常有用。我在一个项目中有多个数据库实例,这是一个多租户应用程序,每个租户都有自己的数据库。我想编写这么多云函数是不切实际的,我可能不得不考虑其他方法。关于多租户,我有多个租户,但它仍然是一个应用程序,对DB的任何访问都基于授权和代码逻辑(根据租户登录的情况访问租户的DB),它可以工作,我是firebase的新手,因此我必须阅读更多关于这方面的内容,以便从安全角度真正理解它,谢谢你指导我,我一定会深入研究这个问题。如果你发现这个答案是有用的,请标出它是正确的。我想写很多云函数是不实际的,我可能不得不考虑其他方法。关于多租户,我有多个租户,但它仍然是一个应用程序,对DB的任何访问都基于授权和代码逻辑(根据租户登录的情况访问租户的DB),它可以工作,我是firebase的新手,因此我必须阅读更多关于这方面的内容,以便从安全角度真正理解它,谢谢你的指导