Reputation: 18555
When registering new email/password type users, I need to make user that the displayName
that they enter does not already exist in my Realtime Database before calling .createUserWithEmailAndPassword
. So I need a query. I need to get a list of all displayName
's in my users
branch. I am confused as to how to gather this for each user
which is denoted by each users auth.uid.
What would the retrieval look like? I am thinking something like:
firebase.database().ref('users/' + allUserIds).equalTo('Joe');
but I know that allUserIds
is not valid. Can someone help me with this?
{
"users" : {
"6mJb9vtpbDelyyjirKEf6sSEj8h1" : {
"name" : "[email protected]",
"provider" : "password",
"displayName" : "Joe"
},
"T7D7qEOPPHXjKSzglKheGJDQNkE3" : {
"name" : "[email protected]",
"provider" : "password",
"displayName" : "Jane"
},
"kTG9R0V4aXYsogQfgF633KFYtzV2" : {
"name" : "Andre3000",
"provider" : "google.com",
"displayName" : "Andre"
}
}
}
Upvotes: 2
Views: 2830
Reputation: 18555
Just thought I'd share my somewhat fleshed out solution. Call with 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;
}());
Upvotes: 0
Reputation: 598728
You'd use Firebase queries for that:
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')
});
Don't forget to define an index on users
:
{
"rules": {
"users": {
".indexOn": "displayName"
}
}
}
Upvotes: 3