Firebase Firestore新增文档报Invalid document reference错误如何解决
问题原因
- 初始报错的核心是
addDoc方法入参使用错误:addDoc的第一个参数必须是集合引用,作用是在指定集合中自动生成文档ID并写入数据。你最初传入的是doc(collection(db, 'udstyr'))返回的文档引用,Firebase会误判为要在这个文档下创建子集合的文档,最终生成udstyr/自动生成的文档ID/子文档ID的3段路径,不符合Firestore「集合路径为奇数段、文档路径为偶数段」的规则,因此抛出段数错误。 - 改完代码后无报错也无效果的核心原因是:你代码中使用的
generateUUID方法没有定义也没有引入,执行到这一行时会直接抛出异常被catch捕获,你没有打开浏览器控制台的话就看不到打印的错误信息。
解决方案
提供两种可用的写法,按需选择即可:
写法1:使用Firebase自动生成的文档ID(推荐)
Firebase自动生成的文档ID已经具备全局唯一性,不需要额外自己生成UUID:
export async function opretUdstyr(navn, type, note) { try { let nyUdstyr = { navn: navn, type: type, note: note, status: "Tilgængelig", fra: "", til: "" }; // 直接传入集合引用,addDoc会自动生成ID创建文档 const docRef = await addDoc(collection(db, 'udstyr'), nyUdstyr); // 如果需要把文档ID存到字段里,可以追加更新 await setDoc(docRef, { UUID: docRef.id }, { merge: true }); console.log("设备新增成功,文档ID:", docRef.id) } catch (e) { console.error("新增设备失败:", e) } }
写法2:使用自定义UUID作为文档ID
如果一定要用自己生成的UUID作为文档ID,使用setDoc方法即可,注意要先确保generateUUID方法已经正确引入或定义:
export async function opretUdstyr(navn, type, note) { try { // 此处必须确保generateUUID方法可用 const uuid = generateUUID(); // 手动指定文档ID为生成的UUID const docRef = doc(db, 'udstyr', uuid); let nyUdstyr = { navn: navn, type: type, note: note, status: "Tilgængelig", fra: "", til: "", UUID: uuid }; await setDoc(docRef, nyUdstyr); console.log("设备新增成功,文档ID:", uuid) } catch (e) { console.error("新增设备失败:", e) } }
额外排查点
如果修改代码后还是写入失败,检查Firestore安全规则是否开放了写入权限,测试阶段可以临时使用以下规则验证(上线前请替换为符合业务安全要求的规则):
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if true; } } }
内容的提问来源于stack exchange,提问作者Selena
相关产品推荐
相关产品推荐

