下面是我的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()
方法创建)。
答案 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;
});