Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase v3孙子查询_Javascript_Firebase_Firebase Realtime Database - Fatal编程技术网

Javascript Firebase v3孙子查询

Javascript Firebase v3孙子查询,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,注册新的电子邮件/密码类型用户时,在调用.createUserWithEmailAndPassword之前,我需要让用户确认他们输入的displayName在我的实时数据库中不存在。所以我需要一个问题。我需要在我的用户分支中获取所有显示名称的列表。我不知道如何为每个用户收集这些信息,这些用户由每个users auth.uid表示 检索结果会是什么样子?我的想法是: firebase.database().ref('users/')+allUserIds.equalTo('Joe') 但是我知道a

注册新的电子邮件/密码类型用户时,在调用
.createUserWithEmailAndPassword
之前,我需要让用户确认他们输入的
displayName
在我的实时数据库中不存在。所以我需要一个问题。我需要在我的
用户
分支中获取所有
显示名称
的列表。我不知道如何为每个
用户
收集这些信息,这些用户由每个users auth.uid表示

检索结果会是什么样子?我的想法是:

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"
    }
  }
}

您可以使用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')
});
不要忘记在
用户上定义索引

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

我只是想和大家分享一下我有点充实的解决方案。调用myApp.displayNameExists('Joe')


对集合运行查询,但对单个项的属性进行排序/筛选。这确实总是有点令人困惑。这提醒了我,别忘了把
.indexOn
放在正确的级别上。我添加了一个示例。我的代码中没有
return
语句,所以我不确定您的意思。如果您在让它工作时遇到困难,您可以设置一个JSFIDLE/jsbin来重现这个问题吗?这个特别的工作是不必要的
.updateProfile
displayName
photoURL
属性存储在Firebase身份验证系统中。因此,不需要在实时数据库的用户节点下设置/获取这些内容。@RonRoyston Firebase身份验证确实保留了每个用户的显示名称。但它(目前)没有获取用户列表的API。由于许多应用程序都需要该功能,开发人员通常会在数据库中保留一个用户/姓名列表。我只是说没有必要在实时数据库中存储displayName或photoURL。基于密码的身份验证不要求也不需要这些属性。直觉告诉我这些东西是从oAuth提供者那里读取的,基于密码的身份验证需要特殊处理。没有。Auth系统可以为您存储这些内容,并为您的用户将所有这些设置为
localstorage
。也许只是我,但直到我发现updateProfile方法除了显示在方法索引中之外,并没有真正的文档化,我才意识到这一点。
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;
}());