Firebase 从身份验证数据创建用户对象
Firebase make user object from auth data
所以我在一个离子应用程序中使用 Angularfire 并试图弄清楚如何创建一个与来自 Auth $createUser 调用的授权数据相关联的用户对象。我的第一次尝试进行了 auth 调用并且用户获得了身份验证,然后创建了一个用户对象并将其推送到 $firebaseArray
中,这工作正常,但我不知道如何在他们登录后获取当前用户更新、销毁或对该用户数据执行任何操作。我已经通过循环遍历用户数组并匹配用户数组项中的 uid 和 auth.uid
项来工作,后者在用户数组对象创建中被设置为相同。如果有一个很大的用户数组并且需要在多个页面上完成,这似乎真的很低效。
我目前的尝试是使用不同的方法,如下所示:
angular.module('haulya.main')
.controller('RegisterController', ['Auth', '$scope', 'User', '$ionicPlatform', '$cordovaCamera','CurrentUserService',
function(Auth, $scope, User, $ionicPlatform, $cordovaCamera, CurrentUserService) {
//scope variable for controller
$scope.user = {};
console.log(User);
$scope.createUser = function(isValid) {
var userModel;
$scope.submitted = true;
//messages for successful or failed user creation
$scope.user.message = null;
$scope.user.error = null;
//if form is filled out valid
if(isValid) {
//Create user with email and password firebase Auth method
Auth.$createUser({
email: $scope.user.email,
password: $scope.user.password
})
.then(function(userData) {
userModel = {
uid: userData.uid,
photo: $scope.user.photo || null,
firstName: $scope.user.firstName,
lastName: $scope.user.lastName,
email: $scope.user.email,
cell: $scope.user.cell,
dob: $scope.user.dob.toString(),
city: $scope.user.city,
state: $scope.user.state,
zip: $scope.user.zip
}
// add new user to profiles array
User.create(userModel).then(function(user) {
$scope.sharedUser = User.get(user.path.o[1]);
});
$scope.user.message = "User created for email: " + $scope.user.email;
})
.catch(function(error) {
//set error messages contextually
if(error.code == 'INVALID_EMAIL') {
$scope.user.error = "Invalid Email";
}
else if(error.code == 'EMAIL_TAKEN'){
$scope.user.error = "Email already in use, if you think this is an error contact an administrator";
}
else {
$scope.user.error = "Fill in all required fields";
}
});
}
};
//Get profile pic from camera, or photo library
$scope.getPhoto = function(type) {
$ionicPlatform.ready(function() {
//options for images quality/type/size/dimensions
var options = {
quality: 65,
destinationType: Camera.DestinationType.DATA_URL,
sourceType: Camera.PictureSourceType[type.toUpperCase()],
allowEdit: true,
encodingType: Camera.EncodingType.JPEG,
targetWidth: 100,
targetHeight: 100,
popoverOptions: CameraPopoverOptions,
saveToPhotoAlbum: false
};
//get image function using cordova-plugin-camera
$cordovaCamera.getPicture(options)
.then(function(photo) {
$scope.user.photo = photo;
}, function(err) {
console.log(err);
});
});
};
}]);
这是控制器正在使用的服务:
angular
.module('haulya.main')
.factory('User', function($firebaseArray) {
var ref = new Firebase('https://haulya.firebaseio.com');
var users = $firebaseArray(ref.child('profiles'));
var User = {
all: users,
create: function(user) {
return users.$add(user);
},
get: function(userId) {
return $firebaseArray(ref.child('profiles').child(userId));
},
delete: function(user) {
return users.$remove(user);
}
};
return User;
});
这也有效,但我还是没有对数组中当前登录的用户对象数据的可靠引用。对象 ID 仅存储在控制器范围内。
我查看了其他帖子,但他们都使用旧版本的 firebase 和不推荐使用的方法。
如果您要存储具有 "natural key" 的项目,最好将它们存储在该键下。对于用户,这将是 uid
.
因此,与其将它们存储在 $add()
中,不如将它们存储在 child().set()
中。
create: function(user) {
var userRef = users.$ref().child(user.uid);
userRef.set(user);
return $firebaseObject(userRef);
}
您会注意到我使用的是非AngularFire 方法child()
和set()
。 AngularFire 构建在 Firebase 的常规 JavaScript SDK 之上,因此它们可以很好地互操作。这样做的好处是您可以使用 Firebase JavaScript SDK 的所有功能,并且只使用 AngularFire 最擅长的事情:将东西绑定到 Angular 的 $scope
.
Storing user data is explained in Firebase's guide for JavaScript。我们也将它们存储在 uid
下,而不是使用 push()
,这是 $add()
在幕后调用的。
所以我在一个离子应用程序中使用 Angularfire 并试图弄清楚如何创建一个与来自 Auth $createUser 调用的授权数据相关联的用户对象。我的第一次尝试进行了 auth 调用并且用户获得了身份验证,然后创建了一个用户对象并将其推送到 $firebaseArray
中,这工作正常,但我不知道如何在他们登录后获取当前用户更新、销毁或对该用户数据执行任何操作。我已经通过循环遍历用户数组并匹配用户数组项中的 uid 和 auth.uid
项来工作,后者在用户数组对象创建中被设置为相同。如果有一个很大的用户数组并且需要在多个页面上完成,这似乎真的很低效。
我目前的尝试是使用不同的方法,如下所示:
angular.module('haulya.main')
.controller('RegisterController', ['Auth', '$scope', 'User', '$ionicPlatform', '$cordovaCamera','CurrentUserService',
function(Auth, $scope, User, $ionicPlatform, $cordovaCamera, CurrentUserService) {
//scope variable for controller
$scope.user = {};
console.log(User);
$scope.createUser = function(isValid) {
var userModel;
$scope.submitted = true;
//messages for successful or failed user creation
$scope.user.message = null;
$scope.user.error = null;
//if form is filled out valid
if(isValid) {
//Create user with email and password firebase Auth method
Auth.$createUser({
email: $scope.user.email,
password: $scope.user.password
})
.then(function(userData) {
userModel = {
uid: userData.uid,
photo: $scope.user.photo || null,
firstName: $scope.user.firstName,
lastName: $scope.user.lastName,
email: $scope.user.email,
cell: $scope.user.cell,
dob: $scope.user.dob.toString(),
city: $scope.user.city,
state: $scope.user.state,
zip: $scope.user.zip
}
// add new user to profiles array
User.create(userModel).then(function(user) {
$scope.sharedUser = User.get(user.path.o[1]);
});
$scope.user.message = "User created for email: " + $scope.user.email;
})
.catch(function(error) {
//set error messages contextually
if(error.code == 'INVALID_EMAIL') {
$scope.user.error = "Invalid Email";
}
else if(error.code == 'EMAIL_TAKEN'){
$scope.user.error = "Email already in use, if you think this is an error contact an administrator";
}
else {
$scope.user.error = "Fill in all required fields";
}
});
}
};
//Get profile pic from camera, or photo library
$scope.getPhoto = function(type) {
$ionicPlatform.ready(function() {
//options for images quality/type/size/dimensions
var options = {
quality: 65,
destinationType: Camera.DestinationType.DATA_URL,
sourceType: Camera.PictureSourceType[type.toUpperCase()],
allowEdit: true,
encodingType: Camera.EncodingType.JPEG,
targetWidth: 100,
targetHeight: 100,
popoverOptions: CameraPopoverOptions,
saveToPhotoAlbum: false
};
//get image function using cordova-plugin-camera
$cordovaCamera.getPicture(options)
.then(function(photo) {
$scope.user.photo = photo;
}, function(err) {
console.log(err);
});
});
};
}]);
这是控制器正在使用的服务:
angular
.module('haulya.main')
.factory('User', function($firebaseArray) {
var ref = new Firebase('https://haulya.firebaseio.com');
var users = $firebaseArray(ref.child('profiles'));
var User = {
all: users,
create: function(user) {
return users.$add(user);
},
get: function(userId) {
return $firebaseArray(ref.child('profiles').child(userId));
},
delete: function(user) {
return users.$remove(user);
}
};
return User;
});
这也有效,但我还是没有对数组中当前登录的用户对象数据的可靠引用。对象 ID 仅存储在控制器范围内。
我查看了其他帖子,但他们都使用旧版本的 firebase 和不推荐使用的方法。
如果您要存储具有 "natural key" 的项目,最好将它们存储在该键下。对于用户,这将是 uid
.
因此,与其将它们存储在 $add()
中,不如将它们存储在 child().set()
中。
create: function(user) {
var userRef = users.$ref().child(user.uid);
userRef.set(user);
return $firebaseObject(userRef);
}
您会注意到我使用的是非AngularFire 方法child()
和set()
。 AngularFire 构建在 Firebase 的常规 JavaScript SDK 之上,因此它们可以很好地互操作。这样做的好处是您可以使用 Firebase JavaScript SDK 的所有功能,并且只使用 AngularFire 最擅长的事情:将东西绑定到 Angular 的 $scope
.
Storing user data is explained in Firebase's guide for JavaScript。我们也将它们存储在 uid
下,而不是使用 push()
,这是 $add()
在幕后调用的。