Firebase启动后无法设置用户数据

时间:2019-11-23 04:02:42

标签: reactjs firebase google-cloud-firestore

我正在Firebase上开发React应用。尽管在Google上已成功进行身份验证,但在进行火灾身份验证后,fire store没有设置userdata的问题。如果您有一些解决方法,请帮助我。而且我在这里找不到错误文本。

  login = () => {
    const provider = new firebase.auth.GoogleAuthProvider();
    firebase
      .auth()
      .signInWithRedirect(provider)
      .then(result => {
        const user = result.user;
        const userRef = firebase
          .firestore()
          .collection("users")
          .doc(user.uid);

        userRef.get().then(function(doc) {
          if (doc.exists) {
            console.log("User data:", doc.data());
          } else {
            // doc.data() will be undefined in this case
            userRef.set({
              uid: user.uid,
              name: user.displayName,
              photoURL: user.photoURL
            });
          }
        });
      });

    this.props.history.push("/");
  };

其他

'user' is not defined.
'userRef' is not defined

我尝试了代码。但是无法在此处定义user和userRef:

    if (doc.exists) {
      console.log("Doc for user " + user.uid + " already exists");
      throw new Error("Doc for user " + user.uid + " already exists");
    } else {
      return userRef.set({
        uid: user.uid,
        name: user.displayName,
        photoURL: user.photoURL
      });
    }

其他2

我不知道为什么,但是在Firebase身份验证上then不起作用。

login = () => {
  let user;
  const provider = new firebase.auth.GoogleAuthProvider();
  firebase
    .auth()
    .signInWithRedirect(provider)
    .then(result => {
      console.log("result", result);
      // result has been skipped

1 个答案:

答案 0 :(得分:1)

实际上,signInWithRedirect()方法返回没有返回值的promise(即Promise<void>)。因此,做

    firebase
      .auth()
      .signInWithRedirect(provider)
      .then(result => {...});

不起作用。

您需要使用getRedirectResult()方法,如文档中所述:

  

使用整页重定向流对Firebase客户端进行身份验证。至   处理此操作的结果和错误,请参阅   firebase.auth.Auth.getRedirectResult

因此,在您的login函数中,您应该只有两行:

  login = () => {
    const provider = new firebase.auth.GoogleAuthProvider();
    firebase
      .auth()
      .signInWithRedirect(provider);
  }

在代码的其他地方(我不知道确切的地方,我不知道reactjs ...),您需要使用以下代码(请注意chained中不同的Promises是如何)的: / p>

    let user;

    firebase
    .auth()
    .getRedirectResult()
    .then(result => {
        user = result.user;
        const userRef = firebase
          .firestore()
          .collection('users')
          .doc(user.uid);

        return userRef.get();
      })
      .then(doc => {
        if (doc.exists) {
          console.log('Doc for user ' + user.uid + ' already exists');
          throw new Error('Doc for user ' + user.uid + ' already exists');
        } else {
          return doc.ref.set({
            uid: user.uid,
            name: user.displayName,
            photoURL: user.photoURL
          });
        }
      })
      .then(() => {
        this.props.history.push('/');
      })
      .catch(error => {
        console.log(error);
        this.props.history.push('/errorPage');
      });

请注意,如果多个用户能够使用同一个Google帐户登录,则在检查userRef上文档是否不存在时,您可能需要使用Transaction