尝试使用 AngularFire 匿名验证用户时获取 Websocket 失败
Getting Websocket Failure when trying to anonymously authenticate user using AngularFire
我正在尝试使用 AngularFire 对用户进行匿名身份验证。我只想对用户进行一次身份验证(因此,如果用户已经过身份验证,则不会生成新的 uid)。当我使用下面的代码时,我收到 previous_websocket_failure
通知。我还在控制台中收到一个错误 TypeError: Cannot read property 'uid' of null
。刷新页面后,一切正常。
对我在这里做错了什么有什么想法吗?
app.factory('Ref', ['$window', 'fbURL', function($window, fbURL) {
'use strict';
return new Firebase(fbURL);
}]);
app.service('Auth', ['$q', '$firebaseAuth', 'Ref', function ($q, $firebaseAuth, Ref) {
var auth = $firebaseAuth(Ref);
var authData = Ref.getAuth();
console.log(authData);
if (authData) {
console.log('already logged in with ' + authData.uid);
} else {
auth.$authAnonymously({rememberMe: true}).then(function() {
console.log('authenticated');
}).catch(function(error) {
console.log('error');
});
}
}]);
app.factory('Projects', ['$firebaseArray', '$q', 'fbURL', 'Auth', 'Ref', function($firebaseArray, $q, fbURL, Auth, Ref) {
var authData = Ref.getAuth();
var ref = new Firebase(fbURL + '/projects/' + authData.uid);
console.log('authData.uid: ' + authData.uid);
return $firebaseArray(ref);
}]);
在您的项目工厂中,您假设 authData
不会为空。这里没有任何保证,因为一旦您将其注入另一个提供者,您的项目工厂就会被初始化。我还注意到您的身份验证服务实际上 return 什么都没有。这可能意味着调用者必须了解内部工作原理并导致相当多的耦合。更 SOLID 的结构可能如下所示:
app.factory('Projects', function(Ref, $firebaseArray) {
// return a function which can be invoked once
// auth is resolved
return function(uid) {
return $firebaseArray(Ref.child('projects').child(uid));
}
});
app.factory('Auth', function(Ref, $firebaseAuth) {
return $firebaseAuth(Ref);
});
app.controller('Example', function($scope, Auth, Projects) {
if( Auth.$getAuth() === null ) {
auth.$authAnonymously({rememberMe: true}).then(init)
.catch(function(error) {
console.log('error');
});
}
else {
init(Auth.$getAuth());
}
function init(authData) {
// when auth resolves, add projects to the scope
$scope.projects = Projects(authData.uid);
}
});
请注意,通常不鼓励在您的控制器和服务中处理身份验证,并处理此 at the router level is a more elegant solution. I'd highly recommend investing in this approach. Check out angularFire-seed 以获取一些示例代码。
我正在尝试使用 AngularFire 对用户进行匿名身份验证。我只想对用户进行一次身份验证(因此,如果用户已经过身份验证,则不会生成新的 uid)。当我使用下面的代码时,我收到 previous_websocket_failure
通知。我还在控制台中收到一个错误 TypeError: Cannot read property 'uid' of null
。刷新页面后,一切正常。
对我在这里做错了什么有什么想法吗?
app.factory('Ref', ['$window', 'fbURL', function($window, fbURL) {
'use strict';
return new Firebase(fbURL);
}]);
app.service('Auth', ['$q', '$firebaseAuth', 'Ref', function ($q, $firebaseAuth, Ref) {
var auth = $firebaseAuth(Ref);
var authData = Ref.getAuth();
console.log(authData);
if (authData) {
console.log('already logged in with ' + authData.uid);
} else {
auth.$authAnonymously({rememberMe: true}).then(function() {
console.log('authenticated');
}).catch(function(error) {
console.log('error');
});
}
}]);
app.factory('Projects', ['$firebaseArray', '$q', 'fbURL', 'Auth', 'Ref', function($firebaseArray, $q, fbURL, Auth, Ref) {
var authData = Ref.getAuth();
var ref = new Firebase(fbURL + '/projects/' + authData.uid);
console.log('authData.uid: ' + authData.uid);
return $firebaseArray(ref);
}]);
在您的项目工厂中,您假设 authData
不会为空。这里没有任何保证,因为一旦您将其注入另一个提供者,您的项目工厂就会被初始化。我还注意到您的身份验证服务实际上 return 什么都没有。这可能意味着调用者必须了解内部工作原理并导致相当多的耦合。更 SOLID 的结构可能如下所示:
app.factory('Projects', function(Ref, $firebaseArray) {
// return a function which can be invoked once
// auth is resolved
return function(uid) {
return $firebaseArray(Ref.child('projects').child(uid));
}
});
app.factory('Auth', function(Ref, $firebaseAuth) {
return $firebaseAuth(Ref);
});
app.controller('Example', function($scope, Auth, Projects) {
if( Auth.$getAuth() === null ) {
auth.$authAnonymously({rememberMe: true}).then(init)
.catch(function(error) {
console.log('error');
});
}
else {
init(Auth.$getAuth());
}
function init(authData) {
// when auth resolves, add projects to the scope
$scope.projects = Projects(authData.uid);
}
});
请注意,通常不鼓励在您的控制器和服务中处理身份验证,并处理此 at the router level is a more elegant solution. I'd highly recommend investing in this approach. Check out angularFire-seed 以获取一些示例代码。