React Native Expo注册模块:Firestore用UID作文档ID报错求助
问题解决:Firestore设置自定义文档ID报错
错误原因
你用collection(db, "users", user.uid)创建了一个子集合引用(路径为users/{uid},共两段路径),但Firestore要求集合引用的路径段数必须是奇数(比如users是1段、users/{uid}/subcol是3段)。而你的需求是在users集合下创建ID为用户UID的文档,并非创建子集合,因此用错了API。
另外,addDoc方法是用来自动生成文档ID的,无法指定自定义ID,这也是你无法实现预期效果的原因。
修正代码
改用doc()指定自定义文档ID,再通过setDoc()写入数据:
try { const userCredential = await createUserWithEmailAndPassword(auth, email, password); const user = userCredential.user; await AsyncStorage.setItem('userData', JSON.stringify(user)); try { // 指定users集合下ID为user.uid的文档引用 const docRef = doc(db, "users", user.uid); // 写入数据到指定ID的文档 await setDoc(docRef, { email: email, username: username, phonenumber: phonenumber, uid: user.uid, isAdmin: false, isSeller: false, sellerID: null, chats: [], }); console.log("Document written with ID: ", docRef.id); // 输出为user.uid } catch (e) { console.error("Error adding document: ", e); } } catch (authError) { // 捕获邮箱/密码认证阶段的错误 console.error("Auth error: ", authError); }
关键说明
doc(db, "users", user.uid):明确指向users集合中ID为user.uid的文档,路径段数为2(集合+文档),属于合法的文档引用。setDoc():用于写入指定ID的文档,若文档不存在则创建,存在则直接覆盖;如果需要保留原有字段仅更新新数据,可使用setDoc(docRef, data, { merge: true })。- 原代码中
addDoc(collection(...))是错误用法,addDoc的参数必须是合法的集合引用,而你传入的路径不符合集合引用的段数要求。
内容的提问来源于stack exchange,提问作者jazzy
相关产品推荐
相关产品推荐

