所以,我有这个 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 数据库对象时......没有任何变化,即使重新加载并等待仍然没有任何变化

最佳答案

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

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

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 等。您无法创建新字段。

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

您更改功能应该更像是...
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")
    }
}

关于javascript - Firebase user.updateProfile({...}) 在 React App 中不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47487388/

10-11 06:02