javascript - 将新用户添加到 firebase 中现有用户的联系人列表中

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

我正在尝试将新用户添加到现有用户联系人列表的联系人列表中。每当 child (新用户)添加到用户列表时,它都有自己的联系人列表,现在其联系人列表中的每个用户都需要使用新用户的联系方式进行更新。

用户结构: enter image description here

联系结构: enter image description here

我写了下面的云函数,它正在运行-

 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/

相关文章:

Firebase 推送唯一性范围

javascript - 使用javascript导航滚动

java - 从 firebase 获取列表时,特定值仅显示在一个 recyclerview 项目中,但不会显示在列表中显示的其他项目中

firebase - 可调用的云函数错误 : Response is missing data field

javascript - 查询平面数据firebase,angularfire

Android Firebase - 无需身份验证即可存储数据

android - 一定时间后自动更改 Firebase Firestore 中的字段值

javascript - CSS 悬停效果仅在点击时生效

javascript - seTtimeout 为零秒

javascript - 使用 AJAX POST 请求发送自定义 HTTP 正文