感谢Frank在Firebase上helping me with this code。我刚刚在Friends集合下推送文档ID时遇到了这个问题。我不确定在下面的代码中将const friendId
和const accepted
推送到friendsList
数组的最佳方法是什么。
const db = admin.firestore();
const friendRef =
db.collection('users').doc(id).collection('friends');
friendRef.get().then((onSnapshot) => {
var promises = [];
onSnapshot.forEach((friend) => {
const personId = String(friend.data().person_id);
const friendId = String(friend.id);
const accepted = friend.data().accepted;
promises.push(db.collection('users').doc(personId).get());
});
Promise.all(promises).then((snapshots) => {
friendsList = [];
snapshots.forEach((result) => {
friendsList.push({
friendId: friendId,
accepted: accepted,
firstName: result.data().name.first,
lastName: result.data().name.last,
});
});
res.send(friendsList);
});
}).catch((e) => {
res.send({
'error': e
});
})
我尝试了一些东西,但它没有用。任何帮助将不胜感激。
答案 0 :(得分:3)
问题在于,您为每个promises
值推送db.collection('users').doc(personId).get()
数组中的调用friend
。除了作为局部变量之外,您永远不会为每个朋友保留personId
,friendId
,accepted
的值。
你应该把它们放在每一个承诺中。为此,您可以像这样返回自定义Promise。
promises.push(new Promise((resolve, reject) => {
db.collection('users').doc(personId).get()
.then(docResult => {
resolve({
friendId: friendId,
accepted: accepted,
doc: docResult
});
})
.catch(reason => {
reject(reason);
});
});
然后当你迭代快照数组时:
snapshots.forEach((result) => {
friendsList.push({
friendId: result.friendId,
accepted: result.accepted,
firstName: result.doc.data().name.first,
lastName: result.doc.data().name.last,
});
});
答案 1 :(得分:0)
正如我刚刚回答你对原始问题的回答一样,我的代码中有一个拼写错误源于混乱的变量名称。
const db = admin.firestore();
const friendRef = db.collection('users').doc(id).collection('friends');
friendRef.get().then((friendsSnapshot) => {
var promises = [];
friendsSnapshot.forEach((friend) => {
const friendId = String(friend.data().person_id);
promises.push(db.collection('users').doc(friendId).get());
});
Promise.all(promises).then((friendDocs) => {
friendsList = [];
friendDocs.forEach((friendDoc) => {
friendsList.push({
personId: friendDoc.id,
firstName: friendDoc.data().name.first,
lastName: friendDoc.data().name.last,
});
});
res.send(friendsList);
});
}).catch((e) => {
res.send({
'error': e
});
})
由于您正在使用doc(friendId)
查找好友的数据,因此friendDoc.id
回调中的then()
将成为每位朋友的ID。
在这种情况下,我高度建议将Cloud Firestore参考文档放在手边。例如,在这种情况下,我发现DocumentSnapshot.id
可以执行所需的操作。