【问题标题】:Firebase functions with AdminSdk and RealtimeDatabase not working带有 Admin Sdk 和实时数据库的 Firebase 功能无法正常工作
【发布时间】:2019-10-22 11:51:06
【问题描述】:

我想使用 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”从控制台启动功能时,日志不会显示,也没有错误。

我有什么遗漏吗?一些进一步的配置或您可能知道的任何错误?

提前谢谢你!

【问题讨论】:

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


    【解决方案1】:

    跟随你的 cmets 更新:

    您希望“使用 Cloud Functions 在实时数据库上创建、编辑、读取和删除”,如您的问题中所述,模仿客户端 SDK 的行为,但来自您控制的服务器.您应该使用直接从此服务器调用的一个或多个 Cloud Functions。最合适的(基于您的 cmets)是使用 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'
            }
          }
    

    初始化 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


    初始答案的剩余部分内容,关于背景触发的云函数

    然后您需要声明一个云函数,如下例所示,通过:

    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 复制的这段代码 sn-p 将侦听在devices 节点下创建的任何新节点,并将创建一个uppercase 节点,original 节点的值以大写形式显示。

    请注意,这是一个后台触发的云函数,当特定路径“发生”某些事情时触发。

    如果您想“在实时数据库上创建、编辑、读取和删除”,如您的问题中所述,模仿客户端 SDK 的行为,您可以定义一个或多个 Cloud Functions您直接从您的应用程序调用。请参阅 Callable 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

    【讨论】:

    • 我想进行 CRUD 操作,而不是监听 CRUD 事件然后进行操作。我需要删除 onEventName 并能够直接访问数据库
    • 好的,请参阅我的答案的底部:“如果您想'在实时数据库上创建、编辑、读取和删除',如您的问题所示,模仿客户端 SDK 的行为” ... 使用一组 Callable Cloud Functions。
    • 但这样我需要将数据传递给我的客户端以实际更新数据库,并且我需要我的客户端以某种方式触发可调用函数。在我的具体情况下,我有一个外部客户端(不使用我的 firebase 应用程序)向函数中创建的 Express 服务器的路由发出发布请求。当此路由接收到数据时,它应该写入数据库。
    • 好了,更清楚了。然后您可以使用 HTTP 云函数,请参阅firebase.google.com/docs/functions/…。我将在答案中写一个(非常)简单的 Cloud Fucntion 示例。
    猜你喜欢
    • 2022-12-14
    • 2019-09-03
    • 2018-03-26
    • 2020-05-18
    • 2020-02-15
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    相关资源
    最近更新 更多