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

如何在Firebase的云函数中访问多个实时数据库实例

戚峻
2023-03-14

我在Firebase项目中使用多个数据库。主(默认)数据库的云函数工作得很好,但是,我不能让它们用于辅助数据库。例如,我想在具有管理员权限的节点上发出读取请求:

//this works
admin.database().ref(nodePath).once('value')...

这在主数据库中有效,但是,如果我想在另一个数据库上执行该命令,则不起作用:

//this doesn't work
admin.database(secondaryDatabaseUrl).ref(nodePath).once('value')...

虽然已经部署了这些功能,但是当我试图执行云功能时,控制台上出现了一个错误。

以下是带有https触发器的云函数的代码:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
const secureCompare = require('secure-compare');

exports.testFunction= functions.https.onRequest((req, res) => {
  const key = req.query.key;
  // Exit if the keys don't match
  if (!secureCompare(key, functions.config().cron.key)) {
    console.error('keys do not match');
    res.status(403).send('error1');
    return;
  }
  //test read request
  //the line below crashes the function
  return admin.database('https://secondary_db_url.firebaseio.com').ref(`/testNode`).once('value').then(dataSnapshot=> {
    console.log('value', dataSnapshot.val());
    return;
  }).catch(er => {
    console.error('error', er);
    res.status(403).send('error2');
  });
});

下面是Firebase控制台中的错误日志:

TypeError: ns.ensureApp(...).database is not a function
    at FirebaseNamespace.fn (/user_code/node_modules/firebase-admin/lib/firebase-namespace.js:251:42)
    at exports.testFunction.functions.https.onRequest (/user_code/index.js:16:16)
    at cloudFunction (/user_code/node_modules/firebase-functions/lib/providers/https.js:26:41)
    at /var/tmp/worker/worker.js:671:7
    at /var/tmp/worker/worker.js:655:9
    at _combinedTickCallback (internal/process/next_tick.js:73:7)
    at process._tickDomainCallback (internal/process/next_tick.js:128:9)

如果我不指定辅助数据库URL,该函数将在我的主数据库上发出读取请求,这很好:

//this works
return admin.database().ref(`/testNode`).once('value').then(dataSnapshot=> {
...

我用的是最新的SDK版本:< code >“firebase-admin”:“^5.5.1"”和< code >“firebase-functions”:“^0.7.3"

那么,如何使用管理员权限在云函数中获取辅助数据库的实例?

共有3个答案

赏新知
2023-03-14

具有云功能

https://firebase . Google . com/docs/database/usage/sharding # connect _ your _ app _ to _ multiple _ database _ instances

所以,它看起来像这样在我的我的云函数index.js顶部:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

const dev = admin.initializeApp({
  databaseURL: "https://appdev.firebaseio.com"
}, 'dev');

const v2 = admin.initializeApp({
  databaseURL: "https://appv2.firebaseio.com"
}, 'v2');

然后,在我的clond函数代码中,我可以执行:

//will change stuff on default database
admin.database().ref().child(`stuff/${stuffId}`).set(myStuff)

//will change stuff on my dev database
admin.database(dev).ref().child(`stuff/${stuffId}`).set(myStuff)

//will change stuff on my v2 database
admin.database(v2).ref().child(`stuff/${stuffId}`).set(myStuff)
鲜于德业
2023-03-14

因此,看起来您正在尝试使用javascript Web客户端API访问多个数据库。像这样将数据库的URL传递给API不适用于Admin SDK:

admin.database('https://secondary_db_url.firebaseio.com').ref(`/testNode`)

相反,您必须初始化第二个应用程序,给它一个名称,并将该应用程序传递给AdminSDK API。下面是一个完整的示例,它将相同的数据写入同一项目中的两个不同的数据库实例:

const functions = require('firebase-functions')
const admin = require('firebase-admin')
admin.initializeApp(functions.config().firebase)

const otherConfig = Object.assign({}, functions.config().firebase)
otherConfig.databaseURL = 'https://your-other-db.firebaseio.com/'
const otherApp = admin.initializeApp(otherConfig, 'otherAppName')

exports.foo = functions.https.onRequest((req, res) => {
    const data = { foo: 'bar' }
    const p1 = admin.database().ref('data').set(data)
    const p2 = admin.database(otherApp).ref('data').set(data)
    Promise.all([p1, p2]).then(() => {
        res.send("OK")
    })
    .catch(error => {
        res.status(500).send(error)
    })
})
郝昊天
2023-03-14

以下是如何使用Admin SDK通过URL访问数据库:

let app = admin.app();
let ref = app.database('https://secondary_db_url.firebaseio.com').ref();

下面是一个来自Admin SDK集成测试的例子:https://github . com/firebase/firebase-Admin-node/blob/master/test/integration/database . js # L52

 类似资料:
  • 我目前有一个类似以下的数据库结构。如果无法在Firebase实时数据库安全规则中循环,我如何基于用户对多个组的访问来保护数据?要遵循的例子... 数据库结构: 我如何在上指定安全规则,以基于中指定的任何组与当前用户的

  • 我有以下Firebase实时数据库连接到我的Flatter项目: 我对flutter和fire base相当陌生,我知道在我的flutter项目中访问此数据库中数据的一种方法是使用数据库引用变量。所以我有以下参考变量: 现在,如何使用此itemRef访问数据库中的温度和脉冲值?

  • 实时数据库触发器在写入创建时是排队还是线程化?

  • 我正在创建一个应用程序,它使用两步对象创建到firebase实时数据库。 我想要的是,在一个捕获onCreate事件的云函数上,如果一些规则不完整,那么create操作就会被停止。 有办法做到这一点吗?或者我需要移除节点而不是拒绝创建? 谢谢你!

  • 我有一个应用程序,存储256行数字,指示网格视图中每个256个单元格的背景颜色。目前所有的值都是-16449536,表示简单的黑色。 以下是我在Firebase数据库中的JSON结构 在onCreative方法中,我使用for循环为每个单元格读取256次: 并非所有网格都是黑色的。每次我重新打开应用程序以触发onCreate方法时,网格模式都会有所不同。我是否达到了firebase实时数据库的某些

  • 我正在为具有许多嵌套行的json数据库寻找将Firebase实时数据库数据迁移到云Firestore的最佳方法。示例: 我没有找到任何可以帮助我的东西。我需要迁移的是Cloud FireStore的新离线功能。我正在使用Ionic3(角度5)