【问题标题】:Firebase v3 Query by Grandchild孙子的 Firebase v3 查询
【发布时间】:2016-07-22 09:13:57
【问题描述】:

在注册新的电子邮件/密码类型用户时,我需要让用户在调用.createUserWithEmailAndPassword 之前让他们输入的displayName 在我的实时数据库中不存在。所以我需要一个查询。我需要在我的users 分支中获取所有displayName 的列表。我很困惑如何为每个用户 auth.uid 表示的每个 user 收集此信息。

检索会是什么样子?我在想这样的事情:

firebase.database().ref('users/' + allUserIds).equalTo('Joe');

但我知道allUserIds 无效。有人可以帮我解决这个问题吗?

{
  "users" : {
    "6mJb9vtpbDelyyjirKEf6sSEj8h1" : {
      "name" : "asdfs@asdf.com",
      "provider" : "password",
      "displayName" : "Joe"
    },
    "T7D7qEOPPHXjKSzglKheGJDQNkE3" : {
      "name" : "gfdsdf@hlkjh.com",
      "provider" : "password",
      "displayName" : "Jane"
    },
    "kTG9R0V4aXYsogQfgF633KFYtzV2" : {
      "name" : "Andre3000",
      "provider" : "google.com",
      "displayName" : "Andre"
    }
  }
}

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    您会为此使用 Firebase 查询:

    var users = firebase.database().ref('users');
    var joes = users.orderByChild('displayName').equalTo('Joe');
    joes.once('value', function(snapshot) {
      console.log('A Joe does '+(snapshot.exists()?'':'not ')+' exist')
    });
    

    别忘了在users上定义一个索引:

    {
      "rules": {
        "users": {
          ".indexOn": "displayName"
        }
      }
    }
    

    【讨论】:

    • 您对集合运行查询,但对单个项目的属性进行排序/过滤。这确实总是有点令人困惑。这提醒我,不要忘记在正确的级别上添加.indexOn。我添加了一个示例。
    • 我的代码中没有return 语句,所以我不确定你的意思。如果你无法让它工作,你能设置一个 jsfiddle/jsbin 来重现这个问题吗?
    • 这种特殊的努力是不必要的。 .updateProfiledisplayNamephotoURL 属性存储在 Firebase 身份验证系统中。因此,无需在实时数据库的用户节点下设置/获取这些内容。
    • @RonRoyston Firebase 身份验证确实保留了每个用户的显示名称。但它(当前)没有获取用户列表的 API。由于许多应用程序都需要该功能,因此开发人员通常最终会在数据库中保留用户/名称列表。
    • 明白。我只是说没有必要在您的实时数据库中存储 displayName 或 photoURL。基于密码的身份验证不要求这些属性/属性,也不需要它。直觉告诉我这些东西是从 oAuth 提供者那里读取的,并且基于密码的身份验证需要特殊处理。它没有。 Auth 系统可以为您存储这些内容,并将为您的用户将所有这些设置为 localstorage。也许只有我一个人,但直到我发现 updateProfile 方法除了显示在方法索引中之外并没有真正记录下来,我才意识到这一点。
    【解决方案2】:

    只是想我会分享我有点充实的解决方案。拨打myApp.displayNameExists('Joe')

    var myApp = (function() {
        var pub = {};
        pub.displayNameExists = function(name) {
                var users = firebase.database().ref('users');
                var duplicate = users.orderByChild('displayName').equalTo(name);
                duplicate.once('value').then(function(snap) {
                    if (snap.val()) {
                        console.log('found. ask for new display name');
                    } else {
                        console.log('name unique.  ok to write this user to db');
                    }
                }, function(error) {
                    // The Promise was rejected.
                    console.error(error);
                });
            }
            //API
        return pub;
    }());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      • 2014-05-30
      • 2019-07-08
      • 2013-08-19
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多