我正在尝试将新用户添加到现有用户联系人列表的联系人列表中。每当 child (新用户)添加到用户列表时,它都有自己的联系人列表,现在其联系人列表中的每个用户都需要使用新用户的联系方式进行更新。
我写了下面的云函数,它正在运行-
var functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.newUserAdd = functions.database.ref('users/{uid}').onWrite(event => {
const userObj = event.data.val();
const userKey = event.data.key;
console.log("New user added: " + userKey + " " + userObj.display_name);
const userRef = admin.database().ref('/users');
return event.data.child('contacts').forEach(function(data1){
console.log("Updating " + data1.key + " adding contact: " + userKey);
userRef.child(data1.key).child('contacts').child(userKey).set({display_name:userObj.display_name,type:userObj.type});
});
});
但是每当更新任何用户的数据时都会发生太多的调用。有没有办法仅在添加新用户或更改任何用户的“display_name”或“type”时调用函数?
最佳答案
您已经陷入了在公共(public)根下嵌套不同数据类型的陷阱。在 Firebase 数据库中,建议将每种类型的数据保留在树的自己的部分下。
就您而言,有两种类型的数据:
- 用户的简单属性
- 用户的相关联系人
将它们建模为两个单独的顶级节点是惯用的:
users
$uid
displayName: ""
type: ""
contacts
$uid
$contactUid: true
您会注意到这两个集合都使用 $uid
作为它们的键。这意味着一旦您知道用户的 UID,您就可以轻松查找用户的个人资料或该用户的联系人。
通过这种结构,仅在用户的个人资料更改时触发也很简单。只需将您的函数注册为仅在 /users
下的更改时触发:
exports.newUserAdd = functions.database.ref('users/{uid}').onWrite(event => {
if (!event.data.previous.exists() && event.data.exists()) {
您会注意到,我还添加了一个条件,确保代码仅在首次写入用户记录时运行。
关于javascript - 将新用户添加到 firebase 中现有用户的联系人列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43611128/