首页 文章

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

提问于
浏览
1

我正试图通过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,我是否必须 Build $ priority . 当我尝试时,我收到一个错误,指出我不能有任何特殊字符 . 所以这永远不会奏效 . 我真的不关心如何存储这些数据,我只想获取数据的索引,以便我可以检索正确的用户 .

2 回答

  • 1

    通过使用 $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) 来访问用户的节点 .

    课程

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

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

    • 如果您知道要检索的节点的名称,则不需要查询 . 您只需访问该节点 ref.child(user.uid) 即可 .

  • 2

    感谢弗兰克,我能够找到正确的方法来做到这一点 . 为了使我自己的用户对象可搜索,我可以使用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');
      });
    

    谢谢你指着我正确的方向弗兰克 .

相关问题