AngularFire:在SimpleLogin中从电子邮件中获取用户数据的ID

时间:2014-09-07 23:00:34

标签: angularjs firebase angularfire

我试图通过AngularFire和Angular.js使用Firebase实现一些简单的使用注册。我使用SimpleLogin工具来管理用户。我可以很好地创建用户。

  var firebaseRef = new Firebase(FIREBASE_URL);
  var simpleLogin = $firebaseSimpleLogin(firebaseRef);

  var firebaseUsersRef = new Firebase(FIREBASE_URL + 'users');
  var firebaseUsers = $firebase(firebaseUsersRef);

  var myObject = {

    register: function(user) {
      var myDate = new Date().getTime();

      return simpleLogin.$createUser(
        user.email, user.password)
        .then(function(regUser) {
            var userInfo = {
                date: myDate,
                md5: regUser.md5_hash,
                firstname: user.firstname,
                lastname: user.lastname,
                email: user.email
              }
            firebaseUsers.$push(userInfo).then(function(ref) {
              userInfo.uid = ref.name();
              $rootScope.currentUser = userInfo;
            });
        }); //push user
    }, //register

像魅力一样工作。为了在用户登录时获取此信息,我尝试在$ rootscope上实现事件处理程序。我希望能够搜索我存储的uid,然后使用正确的用户信息记录下来。

$rootScope.$on('$firebaseSimpleLogin:login', function (e, authUser) {
  var query = $firebase(firebaseRef.startAt(authUser.uid).endAt(authUser.uid));
  console.log(query);
  $location.path('/meetings');
});

为了使用startAt和endAt,我是否必须建立$ priority。当我尝试时,我收到一个错误,指出我不能有任何特殊字符。所以这永远不会奏效。我并不真正关心如何存储这些数据,我只想获取数据索引,以便我可以检索到正确的用户。

2 个答案:

答案 0 :(得分:2)

使用$push,您可以告诉Firebase为您生成密钥。

这对于您通常同时访问所有孩子的馆藏非常有用。但您的用户信息并非如此:您想要访问当前用户的信息。

因此,我不会使用$push添加您的用户信息,而是使用用户的uid

在常规的Firebase JavaScript API中,可以通过以下方式实现:

firebaseUsersRef.child(reguser.uid).set(userInfo);

AngularFire中的等效内容可能使用$set,但我认为您的$createUser回调中没有任何需要。

更新

您好像正在尝试将自己的信息添加到Firebase为您创建的现有用户节点。这是来自Firebase documentation on storing user data

的示例
  myRef.child('users').child(user.uid).set({
    displayName: user.displayName,
    provider: user.provider,
    provider_id: user.id
  });

您可以看到他们使用类似于我提议的child(user.uid)访问用户的节点。

的教训

据我所知,这里有两个相对较小的错误:

  1. 当您使用push / $push时,您可以让Firebase为您生成节点名称。如果已经存在全局唯一ID(例如用户的uid),则通常最好将其用作节点名称。

  2. 如果您知道要检索的节点的名称,则不需要查询。您只需以ref.child(user.uid)

  3. 访问该节点即可

答案 1 :(得分:1)

感谢弗兰克,我能够找到正确的方法来做到这一点。为了使我自己的用户对象可搜索,我可以使用simpleLogin对象中的uid。所以我的寄存器功能是这样的:

var firebaseRef = new Firebase(FIREBASE_URL);
var simpleLogin = $firebaseSimpleLogin(firebaseRef);

var myObject = {
register: function(user) {
  var myDate = new Date().getTime();

  return simpleLogin.$createUser(user.email, user.password)
    .then(function(regUser) {
        var userInfo = {
            date: myDate,
            md5: regUser.md5_hash,
            firstname: user.firstname,
            lastname: user.lastname,
            email: user.email
          }

        firebaseUsers.$set(regUser.uid, userInfo);
    }); //add user
}, //register
} //my Object

使用set而不是push,我可以将注册用户的uid存储到对象中,然后传递我想要添加的内容作为第二个参数。我的数据库现在将由uid组织用户,可以通过URL访问。

然后,当用户登录时,Firebase将与经过身份验证的用户一起抛出登录事件,我可以捕获并使用该用户将当前用户添加到可在我的应用程序中访问的$ rootScope。

 $rootScope.$on('$firebaseSimpleLogin:login', function (e, authUser) {
    var ref = new Firebase(FIREBASE_URL + '/users/' + authUser.uid);
    var user = $firebase(ref).$asObject();

    user.$loaded().then(function() {
      $rootScope.currentUser = user;
    });

    $location.path('/meetings');
  });

感谢你指出我正确的方向弗兰克。