我最近在Thinkster上使用了关于使用Angular和Firebase创建Web应用程序的教程。使用Firebase实施唯一的用户名simplelogin
本教程使用Firebase simpleLogin方法允许创建包含用户名的“配置文件”。
工厂:
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();
});
};
在教程的结尾处,有一个 '下一个步骤' 部分,其包括:
强化用户名的唯一性 - 这是一个窍门Y,检查出火力地堡优先事项,并看看是否可以使用它们的用户名
我已经搜查,搜查查询用户配置文件,但无法找到如何做到这一点明确的解释,特别是在setPriority()方面Firebase的功能
我是Firebase的新手,所以这里的任何帮助都会很感激地收到。
有几个similar questions,但我似乎无法弄清楚如何解决这个问题。
提前致以巨大的感谢。
编辑
从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
}
});
};
但它抛出一个“undefined是不是一个函数”错误行var q = ref.child('profile').orderByChild('username').equalTo($scope.user.username);
。我已经将代码注释掉了,然后尝试了console.log(q),但仍然没有任何喜悦。
EDIT 2
与上面的问题是,Thinkster教程使用火力地堡0.8和orderByChild只有在以后的版本可用。更新和马林的答案是完美的。
我不明白教程装置如何使用的优先级这一点,也许他们的意思[查询](https://www.firebase.com/docs/web/api/query /)。这些可用于检查客户端是否存在具有某个用户名的用户。此外,您可能希望查看服务器端安全规则,以防止编写已存在的用户名。 – Marein
好点Marein,我认为thinkster教程的一部分可能是Firebase支持'orderByChild'之前的一个剩余部分。那时候你只有'setPriority',所以这将是唯一的查询机制。现在,我确实只需将用户'email'存储在他们的'/ profile/'节点,然后'ref.child('profile')。orderByChild('email')。equalTo(emailThatIsTryingToRegister).once('value')。 ..' –
谢谢你们两个 @FrankvanPuffelen - 我想我理解这个概念,但你介意给我一些指导,以了解在哪里以及如何适应我现有的代码?另外,我认为在我的特定用途case我会使用'orderByChild('username')'? –