Firebase-admin在Express中未返回文档却返回其他对象的问题
解决Firestore get()返回QuerySnapshot而非文档数组的问题
你调用await db.collection("cities").get()得到的是Firestore的QuerySnapshot对象,这是正常返回结果,并非错误。要获取城市列表,需要从这个对象中提取文档数据:
提取城市列表数据
使用QuerySnapshot的docs属性获取所有文档快照,再通过data()方法提取每个文档的实际数据,同时可以保留文档ID:
const db = firebase-admin.firestore(); const snapshot = await db.collection("cities").get(); // 转换为包含ID和数据的数组 const cities = snapshot.docs.map(doc => ({ id: doc.id, // 可选,保留Firestore文档ID ...doc.data() // 文档中的实际数据 }));
实现分页功能
结合limit()和startAfter()(或startAt())可以实现分页,核心是记录每页最后一个文档的快照,作为下一页的起始标记:
第一页查询
const pageSize = 10; // 每页条数 const firstPageSnapshot = await db.collection("cities") .limit(pageSize) .get(); const firstPageCities = firstPageSnapshot.docs.map(doc => ({ id: doc.id, ...doc.data() })); // 保存最后一个文档,用于下一页查询 let lastVisibleDoc = firstPageSnapshot.docs[firstPageSnapshot.docs.length - 1];
下一页查询
if (lastVisibleDoc) { const nextPageSnapshot = await db.collection("cities") .limit(pageSize) .startAfter(lastVisibleDoc) // 从上一页最后一个文档之后开始查询 .get(); const nextPageCities = nextPageSnapshot.docs.map(doc => ({ id: doc.id, ...doc.data() })); // 更新最后一个文档标记,无更多数据时置为null lastVisibleDoc = nextPageSnapshot.empty ? null : nextPageSnapshot.docs[nextPageSnapshot.docs.length - 1]; }
通过nextPageSnapshot.empty可以判断是否还有更多数据,如果为true则表示已经没有下一页。
内容的提问来源于stack exchange,提问作者Ogoh.cyril
相关产品推荐
相关产品推荐

