我正在创建一个云函数,该函数接收来自客户端的呼叫,包括当前用户ID。我想要实现的是从当前用户ID下的“用户”集合中获取朋友ID列表,然后为每个朋友ID从名为“位置”的集合中获取对象列表。下面的代码具有正确的查询,但是关于promise处理和return语句存在一些混淆。如何从第二个“ then”内部正确返回结果?当前返回HttpsCallableResult并将数据作为空映射,甚至认为它应该包含2个对象。
exports.friendsData = functions.https.onCall((data, context) => {
return admin
.firestore()
.collection('users')
.doc(data.id)
.get()
.then(snapshot => {
const friendsIds = snapshot.data().friends;
console.log('friendsIds', friendsIds);
return Promise.all(
friendsIds.map(id => {
console.log('id', id);
return admin
.firestore()
.collection('locations')
.where('userid', '==', id)
.get();
})
);
})
.then(locationSnapshots => {
const results = [];
for (const locationSnap of locationSnapshots) {
const data = locationSnap.data();
console.log('data', data);
results.push(data);
}
console.log('resuts', resuts);
return resuts;
})
.catch(reason => {
return reason;
});
});
编辑 locations集合包含带有自动生成的id的文档,并且每个文档都有一个名为“ userid”的字段,该字段用于where查询 Image for location collection structure
基于注释的更新代码。 locationSnapshots应该是之前添加的每个promise的查询快照的数组。仍然不确定。
答案 0 :(得分:0)
我将在答案中记录迄今为止我们发现的错误之处:
首先,您需要在.get()
之后输入.where(...)
来获得承诺。
第二,如果friendsIds
是一个数组,而您要迭代该数组的内容,请更改此内容:
for (const id in friendsIds)
对此:
for (const id of friendsIds)
使用in
时,它会迭代对象的属性,在数组的情况下,该属性将是数组索引,而不是数组值。
由于尝试从数组创建数组,因此最好切换为使用.map()
。更改此:
const promises = [];
for (const id in friendsIds) {
const p = admin
.firestore()
.collection('locations')
.where('userid', '==', id)
.get();
promises.push(p);
}
return Promise.all(promises);
对此:
return Promise.all(friendsIds.map(id => {
return admin
.firestore()
.collection('locations')
.where('userid', '==', id)
.get();
}));