我想使用 firebase 函数在实时数据库上创建、编辑、读取和删除。查看其他类似问题,我看到必须使用 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 环境变量。 无论如何,我尝试用 cert 方法设置它,结果没有改变。由于 3 个帐户显示在服务帐户部分,我也尝试了所有这些帐户。
也就是说,当使用“firebase serve”从控制台启动功能时,日志不会显示,也没有错误。
有什么我想念的吗?一些进一步的配置或您可能知道的任何错误?
提前致谢!
最佳答案
更新您的评论:
您想要“使用 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
});
});
});
您可以通过向以下 URL https://us-central1-YOURPROJECTID.cloudfunctions.net/writeToNode
发出 POST 来调用它,正文如下:
{
nodeRef: 'theNode',
nodeValue: {
firstName: 'John',
lastName: 'Doe'
}
}
初始化管理 SDK:
如果您想从 Cloud Functions 与同一 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 Functions
然后您需要声明一个云函数,如下例所示,方法是:
- 选择一个“event handler”;
- 指定监听事件的数据库路径;
- 执行所需的逻辑(通常使用写入路径的数据,或指示节点已删除等...)
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
关于javascript - Admin Sdk 和实时数据库无法正常工作的 Firebase 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58503666/