我正在尝试对数据进行分页,这样我就可以在应用程序上无限滚动帖子。我有一个名为getPosts的云函数,其中有多个get函数a读取。这样一切都很好。但是,当我尝试使用云函数进行分页时,我遇到了将最后一个快照作为查询参数发送的问题。这个快照将是超长的,长度出乎意料,远远超过3000个字符。这是我的getPosts函数:
exports.getPosts = (req, res) => {
const postId = req.query.postId;
if(postId != null){
db
.collection('posts')
.doc(postId)
.get()
.then((doc) => {
if(!doc.exists){
throw 'postNotFound';
}
else{
const voteCount = sumValues(doc.data().votingOptions);
let liked;
let votingOptionsDictionary;
return db.collection('votes')
.where('postId', '==', doc.id)
.where('userHandle', '==', req.user.userHandle)
.get()
.then((voteDoc) => {
return db.collection('likes')
.where('postId', '==', doc.id)
.where('userHandle', '==', req.user.userHandle)
.get()
.then((likeDoc) => {
liked = likeDoc.empty ? false : true;
return res.json([{
postId: doc.id,
userHandle: doc.data().userHandle,
postQuestion: doc.data().postQuestion,
userImageUrl: doc.data().userImageUrl,
imageUrl: doc.data().imageUrl,
postDescription: doc.data().postDescription,
createdAt: doc.data().createdAt
}]);
});
});
}
})
.catch((err) => {
if(err == "postNotFound"){
return res.json({'Error': `Post ID ${postId} does not exists`});
}
else{
console.error(err);
return res.json({error: err});
}
});
}
else{
db
.collection('posts')
.orderBy('createdAt', 'desc')
.limit(10)
.get()
.then(async (data) => {
const promises = await data.docs.map((doc) => {
const voteCount = sumValues(doc.data().votingOptions);
let liked;
let votingOptionsDictionary;
return db.collection('votes')
.where('postId', '==', doc.id)
.where('userHandle', '==', req.user.userHandle)
.get()
.then((voteDoc) => {
return db.collection('likes')
.where('postId', '==', doc.id)
.where('userHandle', '==', req.user.userHandle)
.get()
.then((likeDoc) => {
liked = likeDoc.empty ? false : true;
return {
postId: doc.id,
userHandle: doc.data().userHandle,
postQuestion: doc.data().postQuestion,
userImageUrl: doc.data().userImageUrl,
imageUrl: doc.data().imageUrl,
postDescription: doc.data().postDescription,
createdAt: doc.data().createdAt
};
});
});
})
Promise.all(promises)
.then((posts) => {
res.json(posts);
})
})
.catch((err) => {
console.error(err);
res.status(500).json({ error: err.code});
});
}
}
我想在客户端保存快照对象,然后将其作为可选的查询参数发送到getPosts云函数以获得我想要的数据,但我几乎肯定我不能将该对象作为查询参数发送。。。
如果不能使用实际的DocumentSnapshot对象作为分页的锚定文档,则可以简单地使用文档中与排序相关的字段值。文档中对此进行了描述。因此,如果您在createdAt上有一个单独的排序,则可以将相关字段值传递给startAt()
或startAfter()
。
如果您根本没有定义顺序,那么排序顺序是基于文档ID的,您可以简单地使用where子句来获取大于或小于指定ID的所有文档。例如:where(FieldPath.documentId(), ">", id)
。