我正在尝试制作一个聊天应用程序,并使用Firestore和云功能。 我的Firestore结构是
Users -> name,username,email,etc...
Conversations -> members:[memberId1,memberId2]
当创建了新的对话时,我正在将对话集合添加到Users / {memberId} / Conversation集合,但是它没有被创建或需要很长时间被创建
这是我的云功能,用于向“用户”集合添加对话信息
functions.firestore
.document('Conversations/{conversationId}')
.onCreate((snapshot:any, context:any) => {
const data = snapshot.data();
const conversationId = context.params.conversationId;
if (data) {
const members = data.members;
if(!Array.isArray(members)){
console.log("Members is not an array")
return null;
}
for ( const member of members) {
const currentUserId = member;
const remainingUserIDs = members.filter((u:string) => u !== currentUserId);
remainingUserIDs.forEach(async (m:string) => {
return admin
.firestore()
.collection('Users')
.doc(m)
.get()
.then((_doc) => {
const userData = _doc.data();
if (userData) {
return admin
.firestore()
.collection('Users')
.doc(currentUserId)
.collection('Conversations')
.doc(m)
.create({
conversationId: conversationId,
image: userData.profilePic,
username: userData.username,
unseenCount: 0,
userId: m,
});
}
return null;
})
.catch((err) => {
console.log(err);
return null;
});
});
}
}
return null;
});
,我在日志中看到它被调用而没有错误,但是没有添加任何数据,或者创建它花费了很长时间。 我究竟做错了什么 ? 另一个有趣的事情是我已经在模拟器上测试了该功能,并且可以正常工作,但是在生产中存在问题
答案 0 :(得分:0)
您的代码在从整体函数返回之前没有等待foreach循环中的每个promise解析。该函数只是立即返回null。然后调用并兑现承诺不会使代码暂停。
您的功能must return a promise that resolves only after all other async work is finished。如果不这样做,该功能将提早终止并在工作完成之前清除。这意味着您必须跟踪在foreach循环中开始的所有承诺。我建议阅读这些内容以更好地理解问题,并获得一些有关如何解决此问题的想法: