Firestore中查询到文档时doc.data()正常,创建并设置新文档后调用doc.data()报is not a function错误
问题成因与解决方案
嘿,我来帮你拆解这个问题,其实核心是你拿到的两个对象根本不是一回事儿!
为什么现有文档的data()能用,新创建的却报错?
- 当你从查询快照
snapshot.docs[0]拿到的是**QueryDocumentSnapshot对象**——这玩意儿是Firestore从数据库拉取数据后生成的快照,本身就包含了文档的所有数据,所以调用data()能直接返回内容,完全没问题。 - 而你用
db.collection('...').doc()创建的是**DocumentReference对象**——它只是一个指向Firestore中某个文档的"地址指针",本身不存储任何数据。哪怕你调用set()把数据成功写到了数据库,这个本地的引用对象也不会自动同步刚写入的数据,所以你直接调用data()自然会报错,因为它根本没数据可以返回啊!
怎么解决?
有两种简单的方式,推荐第一种,能让你的返回值类型保持一致,后续代码更省心:
- 写完数据后,主动获取文档快照
const snapshot = await db.collection('...').where('name', '==', name).get() // 补全你漏写的.get()方法 if (snapshot.empty){ const docRef = db.collection('...').doc() // doc()是同步方法,不需要await await docRef.set({/* 你的文档数据 */}) const docSnapshot = await docRef.get() // 主动拉取最新的文档快照 console.log(docSnapshot.data()) // 现在就能正常打印数据了 return docSnapshot } console.log(snapshot.docs[0].data()) return snapshot.docs[0]
这样返回的docSnapshot和snapshot.docs[0]都是同类型的快照对象,后续调用data()完全兼容。
- 若只需返回引用,后续用时再获取快照
这种方式适合不需要立即用数据的场景,但会让后续代码多一步操作:
// 创建并写入后返回引用 const docRef = db.collection('...').doc() await docRef.set({/* 你的文档数据 */}) return docRef // 后续使用该返回值时: const docSnapshot = await returnedDocRef.get() console.log(docSnapshot.data())
另外提个小细节:你原来的代码里const snapshot = await db.collection('...').where('name', '==', name)漏了.get()方法,不然根本拿不到查询快照,估计是笔误~
内容的提问来源于stack exchange,提问作者Blackfrwhite
相关产品推荐
相关产品推荐

