我在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"
那么,如何使用管理员权限在云函数中获取辅助数据库的实例?
具有云功能
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)
因此,看起来您正在尝试使用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)
})
})
以下是如何使用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)