React Native | Firebase Firestore |仅在按两次后存储用户数据

React Native | Firebase Firestore |仅在按两次后存储用户数据,firebase,react-native,google-cloud-firestore,firebase-authentication,Firebase,React Native,Google Cloud Firestore,Firebase Authentication,我期望的是:当我按下文本“注册”一次时,它将在firebase auth中创建一个用户,然后在firestore中创建一个具有单个属性的用户 实际发生的情况:当我按下文本“注册”时,它会立即在firebase auth中创建一个用户,但当我再次按下用户名字段、密码字段或注册按钮时,它只会在firestore中创建一个具有该属性的用户 我怀疑:这与我的承诺和我的计划有关,但我不明白为什么它会这样运作;看起来真的很奇怪 示例代码: import React from "react"; import

我期望的是:当我按下文本“注册”一次时,它将在firebase auth中创建一个用户,然后在firestore中创建一个具有单个属性的用户

实际发生的情况:当我按下文本“注册”时,它会立即在firebase auth中创建一个用户,但当我再次按下用户名字段、密码字段或注册按钮时,它只会在firestore中创建一个具有该属性的用户

我怀疑:这与我的承诺和我的计划有关,但我不明白为什么它会这样运作;看起来真的很奇怪

示例代码:

import React from "react";
import * as firebase from "firebase";
import "firebase/firestore";

const Screen = () => {
  const firestore = firebase.firestore();

  const writeUserData = uid => {
    const docRef = firestore.doc(`users/${uid}`);
    docRef
      .set({
        example_property
      })
      .then(item =>
        console.log("successfully added user to the collection" + item)
      )
      .catch(err => {
        console.log(err);
      });
  };

  return (
    <View style={styles.container}>
      <TouchableOpacity
        style={styles.submitButton}
        onPress={() =>
          firebase
            .auth()
            .createUserWithEmailAndPassword(email, password)
            .then(userObj => writeUserData(userObj.user.uid))
            .catch(error => {
              var errorCode = error.code;
              var errorMessage = error.message;
              console.log("errorCode: " + errorCode);
              console.log("errorMessage: " + errorMessage);
            })
        }
      >
          <Text>Sign Up</Text>
      </TouchableOpacity>
    </View>
  );
};

现在,我已经从.then in writeUserData中删除了匿名函数。请看这里:

const writeUserData = uid => {
    const docRef = firestore.doc(`users/${uid}`);
    docRef
      .set({
        example_property
      })
      .then(console.log("successfully added user"))
      .catch(err => {
        console.log(err);
      });
  };

也许在您最初的示例中,在初始启动时还没有用户?具体请参见关于用户如何可以为null以及如何侦听authState的部分。但恭喜你解决了你的问题!感谢@Tedskovsky的建议,我已经考虑过了,但之前该应用程序一次只做几分钟,然后在我再次按下选择器后立即创建文档:没问题。另外,我注意到上面代码中有一个输入错误:userObj.User.uid需要大写U