如何从Firebase获取displayName?

时间:2018-11-03 13:54:23

标签: javascript firebase firebase-authentication

我一直无法从Firebase中获得显示名称。 下面是注册流程编码

 const promise = auth.createUserWithEmailAndPassword(email, pass)
 .then(
    (user)=>{
   // here you can use either the returned user object or       
 firebase.auth().currentUser. I will use the returned user object
      if(user){
        user.updateProfile({
           displayName: textUsername.val(),
        //    photoURL: // some photo url
        })
      }
  })
  .then( function() {
      console.log('User Name Set!')
  })
  .catch(function() {
    console.log('error')
  });
 promise.catch(e => console.log(e.message));

 })

 firebase.auth().onAuthStateChanged(firebaseUser => {
  if(firebaseUser) {
      console.log(firebaseUser)
  } else {
    console.log('not logged in');
  }
 })

console.log显示“用户名设置!”并且console.log(firebaseUser)显示displayName是在currentUser的数据库中设置的,名称是我所期望的。 但是,

console.log(firebase.auth().currentUser) 

给出null,然后

if (user != null) {
    console.log(user.displayName);
}

这也返回null。

我一直在寻找获取Firebase数据集数据的方法,但我无法做到这一点。

如果有人可以给我任何建议,那将是很棒的事情。

谢谢。

2 个答案:

答案 0 :(得分:0)

firebase.auth().currentUser.displayName返回OAuth提供程序的显示名称。但是,firebase.auth().currentUser异步解析,在页面加载时片刻为空/空。如果将console.log(firebase.auth().currentUser.displayName)放在.onAuthStateChanged内,您会看到。

答案 1 :(得分:0)

我最终使用递归来解决这个问题。我希望有一种更优雅的方法,但这是唯一对我有用的方法。如果您使用其他解决方案解决了此问题,请分享!

我需要这个来创建新用户。当有人登录时,它似乎永远不会返回null。

setTimeout()将递归速度降低了0.5秒,这样您就不会因多次调用该函数而出错。您可以通过调整毫秒来加快或降低速度。

工作代码:

auth.onAuthStateChanged(user => {
    if (user) {
      // Everything inside here happens if user is signed in
      console.log(user)

      // Greet the user with a message and make it personal by using their display name
     injectDisplayName = () => {
          if(firebase.auth().currentUser.displayName === null){
              console.log('happens');
              setTimeout(() => {
                injectDisplayName()
            }, 500)
          } else {
              document.getElementById('display-name-header').textContent = `Hello, ${firebase.auth().currentUser.displayName}`
          } 
      }
      injectDisplayName()

    } else {
      // Everything inside here happens if user is not signed in
    }
  })