问题描述
几天来我一直在追寻这个问题,看来我在网上找到的所有参考资料都已过时且不再相关,因此我将非常感谢您提出任何建议。
>我有一个 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();
但到目前为止,我无法读取/更新第二个数据库上的数据。
希望我没有胡说八道。我的代码有很多其他的包袱,所以我试图尽可能地简化,如果有人能给我一些关于如何专门读/写第二个数据库的指示,我将不胜感激。我觉得我错过了一些非常明显的东西。
谢谢一百万。
##更新##
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