javascript - Admin Sdk 和实时数据库无法正常工作的 Firebase 功能

标签 javascript firebase firebase-realtime-database google-cloud-functions

我想使用 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

然后您需要声明一个云函数,如下例所示,方法是:

  1. 选择一个“event handler”;
  2. 指定监听事件的数据库路径;
  3. 执行所需的逻辑(通常使用写入路径的数据,或指示节点已删除等...)

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

相关文章:

javascript - 如何使用 Javascript 和 CSS 显示自定义打印/分页预览(带页面框)?

javascript - 设置 firebase 后出现以下错误 : Client doesn't have permission to access the desired data

android - 尝试使用 .push() 访问存储在 Firebase 中的对象

java - 从 Firebase 获取不进行任何更改的子项

javascript - Grandchild 的 Firebase v3 查询

php - 如何阻止两个 jquery 库相互冲突?

javascript - 数据表 {"error":"An SQL error occurred: SQLSTATE[42S22]: Column not found: 1054 Unknown column ' 'field list' 中的用户名“}

javascript - 图像 slider 的响应式设计不符合预期

firebase - 我如何在 firebase 中实现基于角色的访问控制

firebase - Cloud Firestore : Same document on different query. 是否按分离读取收费?