将firebase数据库引用作为云函数中的数组返回

时间:2017-11-20 15:21:48

标签: angularjs node.js firebase firebase-realtime-database google-cloud-functions

下面是我的AngularJS范围中作为数组返回的firebase数据库引用:

var ref = firebase.database().ref("users").child(user.uid).child("week1");
$firebaseArray(ref);

但是,当我尝试在我的index.js文件中为数据库云功能编写相同的代码时,出现了错误消息:

  

ReferenceError:$ firebaseArray未定义在/user_code/index.js:22:18

是否有办法在我的index.js云函数文件中将Firebase引用引用返回为数组,因为$firebaseArray未在AngularJS范围之外定义?

以下是数据库的说明:

 users: {
   user uid (generated by push) : {
       deviceToken : "tokenID",
       name : "Display Name"
   },
   anotherUserID : {
       deviceToken : "tokenID",
       name : "Display Name"
   },
Players: {
    player1: John,
    Player2: ken,
}

是否有办法在Players数据库节点中更改以触发users节点中的函数(对于每个用户):

exports.update = functions.database.ref('/Player')
    .onWrite(event=>{
      console.log(event.data);
      var ref = admin.database().ref('/users/'+ user.uid+ '/week1');
      ref.set(10);
      return;
    });

我的问题是为每个用户访问user.uid(由push()方法创建)。

1 个答案:

答案 0 :(得分:2)

在云端功能中,您可以使用Firebase Admin SDK来保存和检索数据库中的数据。要初始化Admin SDK,您可以使用environment configuration

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

然后,您可以将value listener附加到数据库引用,利用并返回JavaScript Promise以使该函数保持活动状态并链接您的逻辑:

const ref = admin.database().ref("/users").child(user.uid).child("week1");

return ref.once("value").then(snapshot => {
    const values = snapshot.val();

    // Do something with the snapshot
});

此处的values变量将在该位置分配一系列值(请参阅val()),因此可以用来代替$firebaseArray

如果需要获取对触发数据库函数的节点的引用,可以使用函数定义中的event参数:

let ref = event.data.ref;

如果您需要获取触发函数的数据库中的特定位置,这将非常有用。 event.data变量是数据库函数的DeltaSnapshot实例。

同样,您可以使用event.params来获取数据库触发器定义中指定的任何变量,例如,可以使用{uid}获取以下定义中的event.params.uid

exports.example = functions.database.ref('/users/{uid}')
    .onWrite(event => {
      const uid = event.params.uid;
      // ...
    });

此处采用的方法取决于您需要执行的功能,触发方式以及需要访问的变量或值。

请记住,您的函数也可以使用Admin SDK在数据库中的任何位置自由读取和写入数据。

在您的最新示例中,很难将/players的节点与/users匹配,因为用户的UID没有值。因此,您需要更改/players子节点以包含更多数据,例如:

players : {
    player1 : {
        name: "John",
        uid: "anotherUserID"
    }
}

然后,您可以使用uid从您的函数中提取此event.data.child('uid').val()(使用/players/{playerId}在此节点下的子项触发您的函数):

exports.update = functions.database.ref('/players/{playerId}')
    .onWrite(event=>{
      console.log(event.data);
      const uid = event.data.child('uid').val();
      var ref = admin.database().ref('/users/' + uid + '/week1');
      ref.set(10);
      return;
    });