Firebase user.updateProfile({...})无法在React App中运行

时间:2017-11-25 15:06:38

标签: javascript reactjs firebase firebase-authentication

所以,我有这个ReactJS应用程序,有一个用户数据库,

创建用户的功能是

import { ref, firebaseAuth } from './../Components/config'

export function auth (email, pw) {
  return firebaseAuth().createUserWithEmailAndPassword(email, pw)
    .then(saveUser)
}
export function saveUser (user) {
  return ref.child(`users/${user.uid}/info`)
    .set({
      email: user.email,
      uid: user.uid,
      number: "" //custom
    })
    .then(() => user)
}

如您所见,用户由3个属性,电子邮件,uid和自定义数字属性组成,最初为“”,

我有一个

changeNumberToNew = (n) =>{
    var user = firebase.auth().currentUser;
      if (user != null) {
          user.updateProfile({
            number: n
          }).then(() => {
            console.log("Number changer");
          }).catch((error) => {
            console.log(error);
          });
      } else {
        console.log("No user")
      }
  };

和一个调用函数的按钮

<button onClick={this.changeNumberToNew(4)}>Click to change number</button>

当我点击按钮时,承诺是解析器,导致执行

console.log("Number changer")

但是当我去查看firebase数据库对象时......没有任何变化,即使重新加载并等待仍然没有任何变化

2 个答案:

答案 0 :(得分:1)

Firebase身份验证updateProfile仅支持displayNamephotoURL。它不支持客户端自定义属性。对于管理员自定义属性,您需要使用管理员SDK:https://firebase.google.com/docs/auth/admin/custom-claims#set_and_validate_custom_user_claims_via_the_admin_sdk

在这种情况下,您可能最好只在数据库中保存这些任意自定义字段(前提是它们不需要管理员权限)。

答案 1 :(得分:0)

我认为这里的问题是您将数据库中的用户对象与身份验证模块中的用户混淆。他们不一样。

您保存了一份&#39;副本&#39;当您在第一个块中说出以下内容时,您的用户对数据库。

ref.child(`users/${user.uid}/info`)
    .set({
      email: user.email,
      uid: user.uid,
      number: ""
    })

然后在第二块代码中,您尝试更新身份验证模块中的当前用户。不好。您应该更新数据库,而不是您的身份验证模块。

var user = firebase.**auth()**.currentUser

if (user != null) {
  user.updateProfile({...})
}

我认为您无法在身份验证模块中的当前用户上创建自定义字段。 updateProfile()用于更新默认情况下从提供者处获得的字段,例如电子邮件,显示名称,photoURL等。您无法创建新字段。

您应该在数据库中更新用户的副本,然后在需要&#39; number&#39;的值时引用该副本。

你改变功能应该更像......

changeNumberToNew = (n) => {
    var user = firebase.auth().currentUser;
    if (user) {
     ref.child(`users/${user.uid}/info`).update({number: n})
     .then(() => console.log("Number changer"))
     .catch(error => console.log(error))
    } else {
      console.log("No user")
    }
}