【问题标题】:Read/Write to multiple DBs in single Firebase Project - Admin SDK Cloud Functions在单个 Firebase 项目中读取/写入多个数据库 - Admin SDK Cloud Functions
【发布时间】:2021-05-20 16:26:29
【问题描述】:

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

我有一个 Firebase 项目,它有一个实时数据库和云功能,可以监听这个数据库并写回更改等。我最近在同一个项目中添加了第二个数据库(更接近用户群),这个是相同的副本第一个,但我发现云功能没有按预期应用。 (默认数据库位于“us-central1”,第二个数据库位于“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、数据库名称等传递到 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();

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

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

谢谢。

##Update##

我也测试了下面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 控制台中测试函数并监控函数日志时,我发现它没有读取第二个数据库并且也给出了这个警告。 p>

[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 的所有变体但没有成功,所以这个解决方案似乎行不通。

【问题讨论】:

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


    【解决方案1】:

    如果您尝试写入触发事件的同一数据库实例,则可以从传递给函数的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");
    })
    

    【讨论】:

    • 感谢@Frank,(您的 Firebase 视频的忠实粉丝!)这看起来确实是一个整洁的解决方案,但如果可能的话,我希望能够以类似的方式更新两个数据库?因为这意味着对我现有代码的修改更少。不过我会试试你的建议。谢谢! :)
    • 这个我最清楚,但其他情况肯定也应该是可能的。希望其他人知道答案。
    【解决方案2】:

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

    // 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

    【讨论】:

    • 不幸的是,这不起作用。我尝试使用“.firebaseio.com”域以及“.firebasedatabase.app”域,这是我数据库中的实际 url。使用“.firebasedatabase.app”域进行部署时,我在终端中收到错误,“错误:FIREBASE 致命错误:无法解析 Firebase url。请使用 https://.firebaseio.com”。当我将其更改为“.firebaseio.com”域时,它将部署但功能控制台日志会引发警告错误并建议将 url 更改回 .firebasedatabase.app 域。
    • 您应该始终使用从 Firebase 控制台复制的正确数据库 URL。我只以firebaseio.com 为例。但是,如果您收到 URL 解析错误,则说明您使用的是旧版本的 SDK,或者您遇到了 SDK 中的错误。首先尝试更新您的依赖项。如果这没有帮助,请提交错误报告。
    • 是的,SDK 的过时版本是我的第一个想法,所以我检查并更新了所有内容,我已经是最新版本了。我只尝试了替代 URL,因为在尝试部署和监视功能控制台中的日志时建议使用它们,因此我尝试了两个版本以查看是否可以缩小问题范围。
    • 确保您使用的是最新版本的 @firebase/database 软件包。您可能必须删除包锁定文件并重新安装才能更新所有内容。
    猜你喜欢
    • 2018-01-24
    • 2017-09-28
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    相关资源
    最近更新 更多