【发布时间】:2018-12-26 13:37:27
【问题描述】:
我正在使用 node.js 从 Firestore 中的 2 个不同集合中获取数据。
这个问题和这个类似,但是这个问题没有答案:Nested Firebase Firestore forEach promise queries
就我而言,我正在创建一个类似 instagram 的应用程序,其中有一个“时间线”集合。在时间线文档中,我有一个用户密钥。通过该用户密钥,我想从“用户”集合中执行另一个查询。
所以逻辑上这里是查询步骤:
- 获取包含用户密钥的时间线数据(以数组形式)。
- 使用该用户密钥,获取用户数据(单个数据)
- 向客户端返回 JSON 响应。
问题是,JSON 响应是在获取用户数据之前返回的。
这是我的代码:
tlRoute.get((req,res)=>{
//reading from firestore
let afs = req.app.get('afs');
var timelineArr = [];
let timelineRef = afs.collection(`timeline/${req.params.key}/timeline`);
timelineRef.get().then((snapshot) => {
snapshot.forEach((doc) => {
if(!doc.exists){
console.log('No such document!');
} else {
//populating timelineData with doc.data()
console.log('populating timelineData');
let timelineData = doc.data();
let userRef = afs.doc(`user/${doc.data().userKey}`);
userRef.get().then((doc) => {
//adding user details to timelineData
console.log('adding user details to timelineData');
timelineData.profileImageUrl = doc.data().profileImageUrl;
timelineData.username = doc.data().username;
timelineArr.push(timelineData);
});
}
});
})
.catch(err => {
console.log(err);
});
console.log('this is the final timelineArr', timelineArr);
//returning response json data to client
return res.json(timelineArr);
});
在控制台日志中,这是我得到的日志:
this is the final timelineArr []
populating timelineData
populating timelineData
adding user details to timelineData
adding user details to timelineData
任何帮助将不胜感激。
【问题讨论】:
-
内部
userRef.get()调用是异步的;这就是使用.then()回调处理结果的原因。 -
那我怎么能等到
userRef.get()先完成后,再调用res.json(timelineArr)呢?
标签: javascript node.js firebase google-cloud-firestore