【发布时间】:2022-01-04 10:01:19
【问题描述】:
我正在尝试从 firestore 获取数据,我的工作流程如下:
-
创建一个数组,然后记录'users'集合的id
-
通过检查上面数组中的值是否存在来检查用户是否存在,如果存在则直接登录,如果不存在则在firestore上创建新集合
但不知道我记录数据时如何正确显示,但是如果我记录长度,它总是显示0,当然每次比较都显示为假
这里是代码
export default function Login(props: LoginI) {
const user = useRef<User>();
const [userExist, setUserExist] = useState<boolean>(false);
let ListUser: any[] = [];
const {} = props;
const addNew = () => {
firestore()
.collection("Users")
.doc(user.current?.user?.email)
.set({
userInfo: { ...user.current },
note: firebase.firestore.FieldValue.arrayUnion(),
});
// .then(() => console.log("success"));
};
const getUser = async () => {
await firebase
.firestore()
.collection("Users")
.get()
.then((data) => {
data.forEach((snapshot) => {
ListUser.push(snapshot.id); ====> //add user to local array
});
});
};
async function signIn() {
// Get the users ID token
const userInfo = await GoogleSignin.signIn();
user.current = userInfo;
getUser();
console.log("firebaseList", ListUser); ==> always return value
console.log("firebaseList", ListUser.length); ==> alway return 0
// ListUser = ListUser.concat(user.current.user?.email);
ListUser.forEach((item) => {
console.log("item", item);
if (item === user.current?.user?.email) {
setUserExist(true);
return;
}
return;
});
console.log(userExist);
// Create a Google credential with the token
const googleCredential = auth.GoogleAuthProvider.credential(
userInfo.idToken
);
// Sign-in the user with the credential
return auth().signInWithCredential(googleCredential);
}
return (
<View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
<Button
onPress={() => {
signIn();
}}
>
<Text style={{ color: "white" }}>Login</Text>
</Button>
</View>
);
}
我不知道我在哪里搞砸了,请帮忙,非常感谢你
【问题讨论】:
-
我唯一看到的是你没有
await你对getUser的调用,这是一个异步函数。这可能会导致竞争条件问题。 -
我不明白@GaëtanBoyals,我试图不调用异步函数,但当我登录时结果仍然返回 0,但如果我记录数据,它会返回真实数据
-
尝试在
login.tsx中放入await getUser();而不是简单的getUser();,第71 行,看看它是否有效。如果没有,我也帮不上什么忙,因为我没有发现任何问题。 -
很高兴能帮上忙!
-
@GaëtanBoyals 听起来像是一个答案 Gaëtan ????能不能把它贴在下面,让系统也能看到问题已经回答了?
标签: javascript reactjs firebase google-cloud-firestore