将用户数据存储到Firebase最终会存储错误的用户

时间:2014-12-24 02:12:01

标签: firebase firebasesimplelogin

我正在尝试在创建用户时存储用户信息,但是使用此js代码,它会获取刚刚创建的用户的第一个注册用户数据。

var ref = new Firebase("https://***.firebaseio.com/");

$('.btn').click(function(e) { 
    var isNewUser = true;
    e.preventDefault()
    var mail = $('#inputEmail').val();
    var pass = $('#inputPassword').val();
    ref.createUser({
       email : mail,
       password : pass
    }, function(error) {
       if (error === null) {
          console.log("User created successfully");
       } else {
          console.log("Error creating user:", error);
       }
       ref.onAuth(function(authData) {
          if (authData && isNewUser) {
             ref.child("users").child(authData.uid).set(authData);
          }
       });
   });
   return false; //Extra insurance
});

1 个答案:

答案 0 :(得分:4)

您的代码只是创建新用户,但用户不会自动登录。引用Firebase documentation on creating user accounts

  

创建帐户不会记录新帐户。

因此,onAuth事件会在创建新帐户时触发,但只有在用户登录(或注销)后才会触发。

在Firebase JavaScript库的2.0.5版之前,您必须以编程方式记录新创建的用户以访问其authData。你的代码没有这样做。

您可以通过在 回调中记录用户并设置用户数据来解决此问题:

ref.createUser({
   email : mail,
   password : pass
}, function(error) {
   if (error === null) {
      ref.authWithPassword({ email: mail, password: pass }, function(error, authData) {
          if (authData) {
              ref.child("users").child(authData.uid).set(authData);
          }
          ref.unauth();
      });
   } else {
      console.log("Error creating user:", error);
   }

});

version 2.0.5开始,authData也作为第二个参数传递给createUser回调函数。所以你也可以这样做:

ref.createUser({
   email : mail,
   password : pass
}, function(error, authData) {
   if (error === null) {
      console.log("User created successfully");
      if (authData) {
         ref.child("users").child(authData.uid).set(authData);
      }
   } else {
      console.log("Error creating user:", error);
   }
});

奇怪的是,在测试时,我只得到最后一个片段的uid。如果这不足以满足您的用例,您可以坚持使用第一个代码段。