You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 19:43:18