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;
}());