React Native Firestore子集合无法获取,请求技术协助
解决Firestore子集合数据获取问题
我来帮你排查这个子集合获取的问题~首先看你的代码,核心问题出在对get()返回值的处理上:
当你调用.collection('questions').get()时,返回的是QuerySnapshot(这是集合查询的结果,包含多个文档),而不是单个文档的DocumentSnapshot,所以直接调用.data()肯定会出错——因为QuerySnapshot根本没有这个方法。
修正后的代码示例
return (dispatch) => { firebase.firestore() .collection('questions') .doc(currentUser.uid) .collection('questions') .get() .then((querySnapshot) => { // 初始化数组存储所有问题数据 const userQuestions = []; // 遍历查询快照里的每一个文档 querySnapshot.forEach((doc) => { // 每个doc是单个文档的快照,调用.data()获取内容,同时保留自动生成的文档ID userQuestions.push({ questionId: doc.id, ...doc.data() // 展开title、description等字段 }); }); console.log('成功获取问题列表:', userQuestions); // 将数据dispatch到Redux store中 dispatch({ type: 'FETCH_USER_QUESTIONS_SUCCESS', payload: userQuestions }); }) .catch((error) => { console.error('获取数据失败:', error); dispatch({ type: 'FETCH_USER_QUESTIONS_FAILURE', payload: error.message }); }); };
关键知识点说明
- QuerySnapshot vs DocumentSnapshot:调用
collection().get()返回QuerySnapshot(多文档集合),调用doc().get()才返回单个文档的DocumentSnapshot。前者需要遍历才能拿到每个文档的数据,后者可以直接用.data()。 - 保留文档ID:因为你的问题文档是自动生成ID的,建议把
doc.id也存入数组,后续更新/删除问题时会用到这个ID。
额外排查点
- 确认
currentUser.uid是有效的值,不是undefined或null(可以在调用前打印一下这个值)。 - 检查Firestore安全规则,确保当前用户有权限读取
/questions/{userId}/questions/{questionId}路径下的数据,比如规则可以这样写:match /questions/{userId}/questions/{questionId} { allow read: if request.auth.uid == userId; } - 如果返回的
querySnapshot.empty为true,说明这个用户的子集合里没有任何文档,可以先确认数据是否正确写入了Firestore。
内容的提问来源于stack exchange,提问作者Gökhan Geyik
相关产品推荐
相关产品推荐

