如何在Firebase的User类中通过Snapshot判断用户是否为新注册用户

我需要判断用户是否是首次在Firebase中注册。我了解UserCredential对象带有additionalDataAttributes属性可用于检查.isNewUser,但不知道如何在Snapshot中实现该操作。
我尝试打印相关代码,但没有得到任何结果。
解决方法
Snapshot本身不会携带isNewUser标记,这个字段只有用户注册时的UserCredential对象里才有。正确的思路是注册时把isNewUser同步到数据库,之后通过Snapshot读取这个字段判断。
1. 注册时写入isNewUser状态
首先在用户注册成功后,从UserCredential里提取isNewUser(注意属性名是additionalUserInfo.isNewUser,不是你说的additionalDataAttributes),并写入数据库:
// 邮箱密码注册示例 firebase.auth().createUserWithEmailAndPassword(email, password) .then((userCredential) => { const user = userCredential.user; // 正确获取isNewUser的方式 const isNewUser = userCredential.additionalUserInfo.isNewUser; // 将状态写入Firestore(实时数据库逻辑类似) return firebase.firestore().collection('users').doc(user.uid).set({ email: user.email, isNewUser: isNewUser, createdAt: firebase.firestore.FieldValue.serverTimestamp() }); }) .catch(err => console.error(err));
2. 通过Snapshot读取判断
后续监听用户数据的Snapshot时,直接读取isNewUser字段即可:
// 监听用户登录状态,获取对应数据Snapshot firebase.auth().onAuthStateChanged(user => { if (user) { firebase.firestore().collection('users').doc(user.uid).onSnapshot(snap => { if (!snap.exists) return; const userData = snap.data(); if (userData.isNewUser) { console.log('用户首次登录'); // 执行首次登录逻辑,比如引导页 // 若需要标记为已处理,可更新字段:snap.ref.update({ isNewUser: false }) } else { console.log('用户非首次登录'); } }); } });
注意事项
- 别混淆属性名:是
additionalUserInfo.isNewUser,不是additionalDataAttributes,这可能是你之前没拿到结果的原因。 - 如果用实时数据库,把Firestore的
collection/doc/set换成实时数据库的ref().set()即可,逻辑完全一致。
内容的提问来源于stack exchange,提问作者kpatel23
相关产品推荐
相关产品推荐

