我想使用firebase函数在RealTime数据库上创建,编辑,读取和删除。在查看其他类似问题时,我看到必须使用AdminSdk,所以我做到了。 我基本上复制/粘贴了相同的Firebase指南提供的代码。
const admin = require("firebase-admin");
const functions = require("firebase-functions");
admin.initializeApp({
credential: admin.credential.applicationDefault(),
databaseURL: "https://<DATABASE_NAME>.firebaseio.com"
});
const db = admin.database();
db.ref("devices")
.once("value")
.then(snapshot => console.log("Snapshot: ",snapshot.val())
.catch(error => console.log(error))
});
在初始化过程中,我使用applicationDefault()设置了凭据,就像之前使用service_account_key.json路径设置了GOOGLE_APPLICATION_CREDENTIALS env变量一样。 无论如何,我尝试使用cert方法进行设置,结果没有改变。由于“服务帐户”部分显示了3个帐户,因此我也尝试了所有这些帐户。
这就是说,从控制台使用“ firebase serve”启动功能时,不会显示日志,也没有错误。
我有什么想念的吗?一些进一步的配置或您可能知道的任何错误?
提前谢谢!
答案 0 :(得分:3)
根据您的评论进行更新:
您要“使用Cloud Functions在实时数据库上创建,编辑,读取和删除”,如您的问题所述,模仿客户端SDK的行为,但要从您控制的服务器上进行。您应该使用直接从该服务器调用的一个或多个Cloud Functions。 (根据您的评论)最合适的方法是使用HTTPS Cloud Function。
例如,您可以具有如下所示的HTTPS云功能,以将其写入实时数据库的特定节点,如下所示:
exports.writeToNode = functions.https.onRequest((req, res) => {
cors(req, res, () => {
const dbNode = req.body.nodeRef;
const objToWrite = req.body.nodeValue;
return admin.database().ref(dbNode).push(objToWrite)
.then(() => {
return res.send("Node " + dbNode + " updated!");
})
.catch(err => {
//please watch the official video https://www.youtube.com/watch?v=7IkUgCLr5oA&t=1s&list=PLl-K7zZEsYLkPZHe41m4jfAxUi0JjLgSM&index=3
});
});
});
您可以通过在以下网址https://us-central1-YOURPROJECTID.cloudfunctions.net/writeToNode
上发布POST来进行调用,其正文如下:
{
nodeRef: 'theNode',
nodeValue: {
firstName: 'John',
lastName: 'Doe'
}
}
初始化Admin SDK:
如果您想通过Cloud Function与同一Firebase项目中的实时数据库进行交互,则只需初始化Admin SDK,而无需任何参数(即admin.initializeApp();
)
通过这种方式,Admin SDK将使用项目的默认服务帐户,并将具有对实时数据库的完全访问权限(即绕过所有安全规则)。
因此,初始化如下:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
/////其他想法/////
请注意,您可以使用实时数据库公开的REST API,而不是通过Cloud Functions开发整个CRUD端点集。参见https://firebase.google.com/docs/database/rest/start
初始答案的其余部分,关于后台触发的云功能
然后,您需要通过以下方式声明一个Cloud Function,如下例所示:
exports.makeUppercase = functions.database.ref('/devices/{pushId}/original')
.onCreate((snapshot, context) => {
// Grab the current value of what was written to the Realtime Database.
const original = snapshot.val();
console.log('Uppercasing', context.params.pushId, original);
const uppercase = original.toUpperCase();
// You must return a Promise when performing asynchronous tasks inside a Functions such as
// writing to the Firebase Realtime Database.
// Setting an "uppercase" sibling in the Realtime Database returns a Promise.
return snapshot.ref.parent.child('uppercase').set(uppercase);
});
从documentation复制的此代码段将侦听在devices
节点下创建的任何新节点,并将创建一个uppercase
值的original
节点节点为大写。
请注意,这是一个后台触发的Cloud Function,当特定路径“发生”某事时触发。
如果您要“在实时数据库上创建,编辑,读取和删除”,如您的问题模仿客户端SDK的行为中所述,则可以定义一个或多个Cloud Functions您可以直接从您的应用调用。请参阅可调用的云函数documentation。
您还可以阅读以下文档项目https://firebase.google.com/docs/functions/get-started和https://firebase.google.com/docs/functions/database-events,还可以观看视频系列:https://firebase.google.com/docs/functions/video-series