$ firebase со ссылкой на идентификатор пользователя, инициализация после входа пользователя лучшая практика?

#firebase #angularfire

#firebase #angularfire

Вопрос:

Как и firefeed, я сохраняю мету пользователя в /users/userid .

Мне нужна мета только для текущего зарегистрированного пользователя, поэтому я думаю, что нужно получить ссылку только для вошедшего в систему пользователя. Поэтому вместо

usersRef = new Firebase(firebase/users/) amp;amp; users = $firebase(usersRef)

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

     var userRef = undefined;
    var user = undefined;

var _setCurrentUser = function (passedUser) {
        console.log(passedUser);
        currentUser = passedUser;
        if (!currentUser) {
        userRef = new Firebase(FIREBASE_URI   'users/'   currentUser.id);
        user = $firebase(userRef);
        }
    };
  

Мой вопрос: это хорошая идея? Если мне не нужна ссылка на весь объект users, имеет ли смысл указывать конкретного пользователя с точки зрения производительности. Как так / каким образом? Есть ли лучший способ подождать, пока у нас не будет идентификатора текущего пользователя, чтобы создать экземпляр firebase для пользователя?

Ответ №1:

В идеале, если вам не нужны все пользователи, вы должны получить конкретную ссылку. Что-то вроде следующего:

 var app = angular.module('myApp', ['firebase']);

// a little abstraction to manage establishing a $firebaseSimpleLogin instance
app.factory('loginService', function($firebaseSimpleLogin, Firebase) {
   var fb = new Firebase(URL);
   var auth = $firebaseSimpleLogin(fb);
   return auth;
});

// a little abstraction to reduce the deps involved in creating a $firebase object
app.factory('syncData', function($firebase, Firebase) {
   return function(pathToData) {
      return $firebase(new Firebase(URL).child(pathToData));
   }
});

app.factory('logInAndReturnUser', function(loginService, syncData) {
   return function(provider) {
      // call the login service
      return loginService.$login(provider)
         .then(function(user) {
            // resolve to a $firebase object for the specific user
            return syncData('users/' user.uid);
         });
   }
});
  

Ui-router от Angular-ui идеально подходит для такого варианта использования, и я настоятельно рекомендую этот подход для работы с auth. Просто настройте a resolve , который возвращает пользователя:

 var app = angular.module('myApp', ['firebase']);

app.factory('loginService', function($firebaseSimpleLogin, Firebase) {
   var fb = new Firebase(URL);
   var auth = $firebaseSimpleLogin(fb);
   return auth;
});

app.configure(function($stateProvider) {
   $stateProvider.state('home', {
      url: '/',
      resolve: {
        'user': function(loginService) {
           // getCurrentUser returns a promise that resolves to the user object
           // or null if not logged in
           return loginService.$getCurrentUser();
        }
      },
      controller: 'homeCtrl'
    })
});

app.controller('homeCtrl', function(user) {
   // assumes we've logged in already, that can be part of router
   // processing or we could check for user === null here and send to login page
   console.log('user is '   user.uid); 
});