Firebase user.updateProfile({...}) 在 React App 中不起作用

IT技术 javascript reactjs firebase firebase-authentication
2021-05-07 22:14:37

所以,我有这个 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>

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

console.log("Number changer")

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

2个回答

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

当您在第一个块中说出以下内容时,您将用户的“副本”保存到数据库中。

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

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

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

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

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

您应该更新数据库中用户的副本,然后在需要“数字”值时引用该副本

您更改功能应该更像是...

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")
    }
}

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

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