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

将用户数据存储到Firebase最终会存储错误的用户,firebase,firebasesimplelogin,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 = $('

嗨,我正在尝试在创建用户时存储用户信息,但是使用这个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
});

您的代码只是在创建新用户,但用户不会自动登录。引述:

创建帐户将不会登录该新帐户

因此,在创建新帐户时,
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);
   }
}))

因为,
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
。如果这还不足以满足您的用例,您可以继续使用第一个代码段。

您的代码只是在创建新用户,但用户不会自动登录。引述:

创建帐户将不会登录该新帐户

因此,在创建新帐户时,
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);
   }
}))

因为,
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
。如果这还不足以满足您的用例,您可以继续使用第一个代码片段。

回答得很好!“onAuth事件仅在用户登录后激发。”--不完全正确,
onAuth()
在身份验证状态更改时激发。在侦听器第一次连接后,它还将以初始状态(可能是
null
)触发。回答得很好!“onAuth事件仅在用户登录后激发。”--不完全正确,
onAuth()
在身份验证状态更改时激发。在侦听器第一次连接后,它还将以初始状态(可能是
null
)触发。