您好我正在使用AngularJS + Firebase和Angular Fire,试图创建一个简单的类似tumblr的博客应用来学习AngularJS的细节。不使用任何角度种子或使用特定教程,只需要根据需要进行学习。
我的$ firebase简单登录系统正常运行。我创建了一个简单的用户注册表单,当用户提交I fire $ createUser()时,我将所有用户输入的配置文件数据加载到createUser promise返回的user.id数据集中。 API文档说他们是一个留空的参数会在创建后自动记录用户,但是我在几个地方读到这个被取出,并且文档没有更新。此外,在常规Firebase API中,它提到用户必须在创建帐户后登录。我尝试在返回的帐户创建承诺中触发$ login()方法,如下所示:
$scope.signUp = function(newuser){
var userData = newuser;
var userRef = new Firebase(FB_URL+'users');
$scope.users = $firebase(userRef); //oooohhhhhh
$rootScope.loginObj.$createUser(newuser.email,newuser.password).then(function(user){
var child = $scope.users.$child(user.id);
child.$set({name:userData.fullname,email:userData.email});
$rootScope.loginObj.$login('password',userData.email,userData.password).then(function(user,error){
$location.path('/home');
},function(error){
console.log(error);
});
//$rootScope.loginObj.user = user;
//$rootScope.currentUser = user;
//$location.path('/home');
//$rootScope.loginObj.$login('password', userData.email, userData.password).then(function(user){
// $location.path('/home');
//},function(error){
// console.log(error);
//});
},function(error){
console.log(error);
});
};
它给我这个错误:
Error {code: "UNKNOWN_ERROR", data: Object, stack: "Error: FirebaseSimpleLogin: FirebaseSimpleLogin: A…ple-login/1.5.0/firebase-simple-login.js:188:231)", message: "FirebaseSimpleLogin: FirebaseSimpleLogin: An unknown error occurred."}
code: "UNKNOWN_ERROR"
data: Object
message: "FirebaseSimpleLogin: FirebaseSimpleLogin: An unknown error occurred."
stack: "Error: FirebaseSimpleLogin: FirebaseSimpleLogin: An unknown error occurred.↵ at Error (native)↵ at Object.fb.simplelogin.Errors.format (https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:33:294)↵ at https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:176:275↵ at fb.simplelogin.providers.Password_.login (https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:90:196)↵ at https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:176:209↵ at r (https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:60:151)↵ at new n (https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:60:79)↵ at fb.simplelogin.client.loginWithPassword (https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:176:81)↵ at fb.simplelogin.client.login (https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:173:85)↵ at Object.login (https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:188:231)"
get stack: function () { [native code] }
set stack: function () { [native code] }
__proto__: d
我也尝试调用我在控制器中创建的方法,类似于$ scope.login(电子邮件,密码),但这也没有用。当用户注册时,它假设将它们带到限制为登录用户的主视图。如果用户未经过身份验证,则会将其退回到登录视图。就像现在一样,用户创建他们的帐户然后被路由到/ home,他们没有显示为经过身份验证,然后退回到登录。 我的路由器配置:
app.config(['$routeProvider', '$locationProvider',
function($routeProvider, $locationProvider) {
$routeProvider
.when('/admin', {
templateUrl: 'admin.html',
controller: 'AdminController',
needsAuth: true
})
.when('/home', {
templateUrl: 'home.html',
controller: 'HomeController',
needsAuth: true
})
.when('/login', {
templateUrl: 'app/html/login-form.html',
controller: 'LogInController',
needsAuth: false
})
.otherwise({redirectTo: '/home'});
}]);
以下是检查用户在启动路由更改后是否经过身份验证的逻辑:
app.run(function ($rootScope, $firebaseSimpleLogin, $location) {
$rootScope.$on('$routeChangeStart', function (event, next, $firebaseSimpleLogin, $scope, $rootScope) {
//console.log(event.targetScope);
console.log(event.targetScope.currentUser);
event.targetScope.loginObj.$getCurrentUser().then(function(user){
var userAuthenticated = null;
if (user || event.targetScope.currentUser)
var userAuthenticated = true;
//console.log(userAuthenticated);
if(!userAuthenticated && next.needsAuth){
$location.path('/login');
}
}, function(error){
console.log(error);
});
});
我尝试通过创建一个名为currentUser的单独变量并使用createUser函数返回的用户数据加载它来环绕问题,然后在将它们带到主视图时检查它。并且它可以工作,但是如果用户刷新,他们会丢失这些信息,因为它没有被保存到会话中,我猜是$ login。
答案 0 :(得分:0)
second argument to $login不是电子邮件地址和密码(如createUser),而是一个对象;与核心FirebaseSimpleLogin方法相同的API。
所以这段代码:
$rootScope.loginObj.$login('password',userData.email,userData.password).then(...)
看起来应该更像这样:
var options = {email: userData.email, password: userData.password};
$rootScope.loginObj.$login('password', options).then(...)
有关详细信息和示例,请参阅API docs on $login。