当前位置: 首页 > 知识库问答 >
问题:

在单个Firebase项目中读取/写入多个数据库-管理SDK云功能

端木兴国
2023-03-14

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

我有一个Firebase项目,它有一个实时数据库和云功能,可以监听该数据库并写回更改等。我最近在同一个项目中添加了第二个数据库(更接近用户群),这是第一个数据库的相同副本,但我发现云功能并不像预期的那样适用。(默认DB位于“us-central1”中,第二个DB位于“eurpoe-west1”中,如果有任何差异)

我发现此主题引用了相同的问题,但没有一个解决方案对我有用,并且引用的一些链接不再有效,因此我无法查看示例。如何在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().)一次(...) 读/写第二个数据库。

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

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

上面的方法将只读取我的项目中的默认数据库,而不是第二个数据库。

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

>

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

    admin.database().instance(“my_example-db-2”).ref();

    管理员数据库(”https://my_example-db-2.firebaseio.com).ref();

    admin . database(" https://my _ example-d b-2 . Europe-west 1 . firebase database . app ")。ref();

    admin.database(“my_example-db-2.火库数据库.app”)。

    我还尝试在初始化时传入数据库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');
    

    如果我使用我的数据库https://my _ example-d b-2 . firebase database . app的url部署上述建议,我将在部署时得到一个错误,

    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-d b-2 . fire base io . 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的所有变体,但没有成功,所以似乎这个解决方案不起作用。

  • 共有2个答案

    叶举
    2023-03-14

    你试过这样的事情吗:

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

    白淇
    2023-03-14

    如果您试图写入触发事件的同一个数据库实例,您可以从传入函数的< code>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");
    })
    
     类似资料:
    • 我正在尝试创建一个类似于以下内容的项目结构: 此外,我们希望避免使用require将所有函数拉到一个index.js文件中。

    • 我在想,在下面描述的场景中使用RXJava是否值得。 一次检索包含一组所需条目的列表,例如特定列的表中查询/选择的结果集。 然后需要在另一个数据源中执行新的查询,以获取for循环中第一个列表中每个元素的相关属性(每个元素一行或多行)。 最后,将检索到的属性集写入csv文件。 例如,可以从数据库中检索公司列表,在本例中,是《财富》杂志中列出的第100个,并将100个对象存储在列表os字符串中。 然后

    • 我是Spring批次的新手。我需要在spring批处理中实现的任务如下: 需要从数据库读取一些元数据。 基于此元数据,我需要读取一些文件。 经过一些处理后,需要将这些值从文件写入数据库。 我的查询如下: c.另外,基于某些条件,我可能需要调用第三组阅读器。如何在步骤中有条件地调用读取器? 谢谢你看了我的帖子。我知道它很长。非常感谢任何帮助。另外,我想一个示例代码片段会帮助我更好地理解这一点。:)

    • 我正在尝试使用Firebase Cloud功能为iOS应用程序创建设备到设备推送通知。每当在数据库中的引用'/user-通知/{通知RecipientUid}/{挑战ID}'处创建新子节点时,我都想触发一个事件。这是我的index.js代码: 当在该位置的数据库中添加新的子数据库时,我收到此错误,“类型错误:函数.数据库.ref(...)。一次不是一个函数“,在 Firebase 控制台的函数日志

    • 以下是我的Spring批处理用例。 > 处理记录。 将处理过的记录逐一写入。 我很清楚第2步和第3步的内容,但不知道如何实现一个可以一次性读取所有记录的读卡器。如何将记录逐一传递给项目处理者/编写者?我应该使用tasklet而不是reader/writer吗?

    • 我需要在某个时间读取firebase数据库中的一个值。另外,即使数据库voteValue在以后的某个时候发生了变化,我也不希望读取值被更新。不过,如果它更容易,我想我会去它。 我的firebase数据库中有许多时隙--它们碰巧是以秒为单位的时间。我已经调用了这些时隙,我在每个时隙都有一个投票值。 所以在下面的例子中,假设时间是@11seconds。我想读到那个时段的投票值是8