Firebase создает объект пользователя из данных аутентификации

Итак, я использую Angularfire в ионном приложении и пытаюсь понять, как создать объект пользователя, связанный с данными аутентификации, из вызова Auth $ createUser. Моя первая попытка состояла в вызове аутентификации, и пользователь прошел аутентификацию, затем был создан пользовательский объект и помещен в $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;
});

Это тоже работает, но опять же, у меня нет надежной ссылки на данные объекта текущего пользователя, вошедшего в систему, из массива. Идентификатор объекта хранится только в области контроллеров.

Я просмотрел другие сообщения, но все они использовали более старые версии firebase с устаревшими методами.


person mikeLspohn    schedule 05.08.2015    source источник


Ответы (1)


Если вы храните элементы с «естественным ключом», лучше всего хранить их под этим ключом. Для пользователей это будет uid.

Поэтому вместо того, чтобы сохранять их с $add(), сохраняйте их с child().set().

create: function(user) {
  var userRef = users.$ref().child(user.uid);
  userRef.set(user);
  return $firebaseObject(userRef);
}

Вы заметите, что я использую не-AngularFire методы child() и set(). AngularFire построен на основе обычного JavaScript SDK Firebase, поэтому они прекрасно взаимодействуют. Преимущество этого заключается в том, что вы можете использовать всю мощь Firebase JavaScript SDK и использовать AngularFire только для того, в чем он лучше всего: привязка вещей к Angular $scope.

Хранение пользовательских данных описано в руководстве Firebase для JavaScript. Мы также храним их под их uid вместо того, чтобы использовать push(), что $add() вызывает за кулисами.

person Frank van Puffelen    schedule 05.08.2015
comment
Спасибо, думаю, это то, что я ищу! Я бился головой об стену, пытаясь получить это. Я не понимал, что вы также можете использовать обычный javascript sdk, поэтому я никогда не тратил время на его изучение. Я определенно буду этим заниматься сейчас. Я впервые использую firebase и только что вскочил. Еще раз спасибо! - person mikeLspohn; 05.08.2015
comment
Пожалуйста, Майк. Я посмотрю, сможем ли мы прояснить совместимость в документации. Но до этого момента я с удовольствием объясню это снова и снова. :-) Если у вас возникнут другие проблемы, просто задайте вопрос! - person Frank van Puffelen; 05.08.2015
comment
Потрясающие. Это работает отлично, еще раз спасибо, и спасибо за отличный продукт! - person mikeLspohn; 05.08.2015