读取/写入单个 Firebase 项目中的多个数据库 - Admin SDK Cloud Functions

问题描述

几天来我一直在追寻这个问题,看来我在网上找到的所有参考资料都已过时且不再相关,因此我将非常感谢您提出任何建议。

>

我有一个 Firebase 项目,它有一个实时数据库云函数,可以监听这个数据库并写回更改等。我最近在同一个项目中添加了第二个数据库(更接近用户群),这是一个相同的副本第一个,但我发现云功能没有按预期应用。 (认 DB 位于“us-central1”,第二个 DB 位于“eurpoe-west1”(如果有区别的话)

我发现该主题引用了相同的问题,但没有一个解决方案适合我,并且引用的一些链接不再有效,因此我无法查看示例。 How to access multiple Realtime Database instances in Cloud Functions for Firebase

使用以下示例,我可以毫无问题地侦听第二个数据库中的更改,

exports.exampleFunct = functions.region('europe-west1').database.instance('my_example-db-2').ref('/users/{uid}/requests/{request}').onCreate((req_snapshot,context) => {
        //Do stuff in here. It works so far...
});

以上对第二个数据库有效,但是我无法使用 admin.database().ref().set() 或 admin.database() 读取/写入第二个数据库。 ref().once(...) .

例如,如果我想在上面的 exampleFunct 中使用此管理调用加载用户的整个节点。

admin.database().ref("users/" + uid).once("value",(user_snap) => {
    //Will only load default database.
});

上面这个方法只会读取我项目中的数据库,不会读取第二个数据库

我尝试了上述函数的变体,将我的数据库 URL、db 名称等传递到 database() 参数中,正如我在网上找到的其他一些解决方案中看到的那样,但没有一个适用我。根据云函数日志中的错误建议,我还尝试在 url 中使用和不使用 .europe-west1 引用。

  • admin.database("my_example-db-2").ref();

  • admin.database().instance("my_example-db-2").ref();

  • admin.database("https://my_example-db-2.firebaseio.com").ref();

  • admin.database("https://my_example-db-2.europe-west1.firebasedatabase.app").ref();

  • admin.database("https://my_example-db-2.firebasedatabase.app").ref();

我还尝试在初始化时传入数据库 url,如下所示。

admin.initializeApp({
    credential: admin.credential.applicationDefault(),databaseURL: 'https://my_example-db-2.europe-west1.firebaseio.com'//tried all variations of url.
});

而且我也尝试像这样设置第二个实例,

const db2 = admin.initializeApp({
    databaseURL: "https://my_example-db-2.firebaseio.com"
},'db2');
...
admin.database(db2).ref();

但到目前为止,我无法读取/更新第二个数据库上的数据。

希望我没有胡说八道。我的代码有很多其他的包袱,所以我试图尽可能地简化,如果有人能给我一些关于如何专门读/写第二个数据库的指示,我将不胜感激。我觉得我错过了一些非常明显的东西。

谢谢一百万。

##更新##

我也测试了下面 Hiranya 建议的方法,但没有成功。

admin.initializeApp();

const defaultDb = admin.database();

// Get a reference to another DB in the same project.
const otherDb = admin.app().database('https://otherdb.firebaseio.com');

如果我使用我的数据库的 url 部署上述建议 https://my_example-db-2.firebasedatabase.app 我将在部署时收到错误消息,

Error: Error occurred while parsing your function triggers.

Error: FIREBASE Fatal error: Cannot parse Firebase url. Please use https://<YOUR FIREBASE>.firebaseio.com

firebaseio.com 不是我数据库的域,但如果我尝试 https://my_example-db-2.firebaseio.com 相反,它会部署得很好,但是当我测试该函数并监视 firebase 控制台中的函数日志时,我发现它没有读取第二个数据库,也发出了此警告。

[2021-02-18T11:47:41.596Z]  @firebase/database: FIREBASE WARNING: 
Namespace my_example-db-2 lives in a different region. 
Please change your database URL to https://my_example-db-2.europe-west1.firebasedatabase.app (https://my_example-db-2.firebaseio.com)

我已经尝试了 URL 的所有变体,但都没有成功,所以这个解决方案似乎不起作用。

解决方法

如果您尝试写入触发事件的同一个数据库实例,您可以从传递给函数的 snapshot 中获取根引用:

exports.exampleFunct = functions.region('europe-west1').database
.instance('my_example-db-2')
.ref('/users/{uid}/requests/{request}')
.onCreate((req_snapshot,context) => {
  const rootRef = req_snapshot.ref.root;
  return rootRef.push("new value");
})
,

你有没有尝试过这样的事情:

// Initialize with the default DB URL (fetched automatically in Cloud Functions)
admin.initializeApp();

const defaultDb = admin.database();

// Get a reference to another DB in the same project.
const otherDb = admin.app().database('https://otherdb.firebaseio.com');

https://firebase.google.com/docs/reference/admin/node/admin.app.App-1#database

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...