Недавно я начал обучение по адресу Thinkster для создания веб-приложения с использованием Angular and Firebase.Выполнение уникальных имен пользователей с помощью Firebase simplelogin
В учебном пособии метод SimpleLogin Firebase позволяет создать «профиль», который включает имя пользователя.
Фабрика:
app.factory('Auth', function($firebaseSimpleLogin, $firebase, FIREBASE_URL, $rootScope) {
var ref = new Firebase(FIREBASE_URL);
var auth = $firebaseSimpleLogin(ref);
var Auth = {
register: function(user) {
return auth.$createUser(user.email, user.password);
},
createProfile: function(user) {
var profile = {
username: user.username,
md5_hash: user.md5_hash
};
var profileRef = $firebase(ref.child('profile'));
return profileRef.$set(user.uid, profile);
},
login: function(user) {
return auth.$login('password', user);
},
logout: function() {
auth.$logout();
},
resolveUser: function() {
return auth.$getCurrentUser();
},
signedIn: function() {
return !!Auth.user.provider;
},
user: {}
};
$rootScope.$on('$firebaseSimpleLogin:login', function(e, user) {
angular.copy(user, Auth.user);
Auth.user.profile = $firebase(ref.child('profile').child(Auth.user.uid)).$asObject();
console.log(Auth.user);
});
$rootScope.$on('$firebaseSimpleLogin:logout', function() {
console.log('logged out');
if (Auth.user && Auth.user.profile) {
Auth.user.profile.$destroy();
}
angular.copy({}, Auth.user);
});
return Auth;
});
Контроллер:
$scope.register = function() {
Auth.register($scope.user).then(function(user) {
return Auth.login($scope.user).then(function() {
user.username = $scope.user.username;
return Auth.createProfile(user);
}).then(function() {
$location.path('/');
});
}, function(error) {
$scope.error = error.toString();
});
};
В самом конце учебника есть 'Следующие шаги' раздел, который включает в себя:
Использовать уникальность имени пользователя - это трюк у, проверить Firebase приоритеты и посмотреть, если вы можете использовать их для запроса профилей пользователей по имени пользователя
Я искал и искал, но не может найти ясное объяснение того, как сделать это, в частности, с точки зрения setPriority() функция Firebase
Я довольно новичок Firebase, поэтому любая помощь здесь была бы с благодарностью получена.
Есть несколько similar questions, но я не могу понять, как это разобраться.
Огромное спасибо заранее.
EDIT
От ответа Marein, я обновил функцию регистров в моем контроллере:
$scope.register = function() {
var ref = new Firebase(FIREBASE_URL);
var q = ref.child('profile').orderByChild('username').equalTo($scope.user.username);
q.once('value', function(snapshot) {
if (snapshot.val() === null) {
Auth.register($scope.user).then(function(user) {
return Auth.login($scope.user).then(function() {
user.username = $scope.user.username;
return Auth.createProfile(user);
}).then(function() {
$location.path('/');
});
}, function(error) {
$scope.error = error.toString();
});
} else {
// username already exists, ask user for a different name
}
});
};
Но это бросает «неопределенный не является функция» ошибка в line var q = ref.child('profile').orderByChild('username').equalTo($scope.user.username);
. Я прокомментировал код после и попробовал просто console.log (q), но все равно не радость.
РЕДАКТИРОВАТЬ 2
Проблема с указанными выше в том, что учебник Thinkster использует Firebase 0,8 и orderByChild доступен только в более поздних версиях. Обновленный ответ Марейн - это прекрасно.
Я не понимаю, как учебник означает использовать приоритеты с этим, возможно, они имели в виду [запросы] (https://www.firebase.com/docs/web/api/query /). Они могут использоваться для проверки на стороне клиента, существует ли пользователь с определенным именем пользователя. Кроме того, вы можете захотеть ознакомиться с правилами безопасности на стороне сервера, чтобы предотвратить запись уже существующих имен пользователей. – Marein
Хорошая точка Marein, я думаю, что часть учебника мыслителя может быть слева от того, когда перед Firebase поддерживается 'orderByChild'.Тогда все, что у вас было, было «setPriority», так что это был бы единственный механизм запросов. В настоящее время я бы просто просто сохранил адрес электронной почты пользователей в своем '/ profile/' узле, а затем 'ref.child ('profile'). OrderByChild ('email'). EqualTo (emailThatIsTryingToRegister) .once ('value'. ..' –
Спасибо вам @FrankvanPuffelen - Я думаю, что понимаю это концептуально, но не могли бы вы дать мне некоторое представление о том, где и как это будет вписываться в мой существующий код? Кроме того, я полагаю, что в моем конкретном использовании Я бы использовал 'orderByChild ('username')'? –