带有AdminSdk和RealtimeDatabase的Firebase功能不起作用

时间:2019-10-22 11:51:06

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

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

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

提前谢谢!

1 个答案:

答案 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,如下例所示:

  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