我有一个谷歌云功能来处理我的firestore数据库中的用户名和个人资料图片更改。每当用户更新他们的个人资料照片或姓名时,云功能就会更新他们的所有评论,以便与新数据匹配。然而,即使我在数据库中只有一个评论,这个函数也要花费一分钟以上的时间来运行。
为什么会发生这种情况,是否有更有效的方法来执行此更新?
exports.onProfilePictureOrNameChange = functions.firestore
.document("userProfiles/{userProfileId}")
.onUpdate(async (change, context) => {
const userNamebefore = change.before.data().usePreferredName ? change.before.data().preferredName : change.before.data().fullName;
const userNameAfter = change.after.data().usePreferredName ? change.after.data().preferredName : change.after.data().fullName;
const nameChanged = userNamebefore !== userNameAfter;
const profilePictureChanged = change.after.data().profilePictureURL !== change.before.data().profilePictureURL;
if (nameChanged || profilePictureChanged) {
const data = {
profilePictureURL: change.after.data().profilePictureURL,
userName: userNameAfter,
};
afs.collection("reviews").where("userProfileId", "==", change.after.id).get().then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
doc.ref.update(data);
});
});
}
});
您没有从Cloud Functions中的顶级代码返回任何内容,这意味着容器无法知道代码何时完成。
要使其正确工作,从顶层代码返回一个承诺,该承诺解析所有异步工作何时完成。正如Dharmaraj所评论的那样,您需要使用Promise.all
来发出循环中嵌套写操作完成的信号。
比如:
exports.onProfilePictureOrNameChange = functions.firestore
.document("userProfiles/{userProfileId}")
.onUpdate(async (change, context) => {
const userNamebefore = change.before.data().usePreferredName ? change.before.data().preferredName : change.before.data().fullName;
const userNameAfter = change.after.data().usePreferredName ? change.after.data().preferredName : change.after.data().fullName;
const nameChanged = userNamebefore !== userNameAfter;
const profilePictureChanged = change.after.data().profilePictureURL !== change.before.data().profilePictureURL;
if (nameChanged || profilePictureChanged) {
const data = {
profilePictureURL: change.after.data().profilePictureURL,
userName: userNameAfter,
};
return afs.collection("reviews").where("userProfileId", "==", change.after.id).get().then(function(querySnapshot) {
const promises = querySnapshot.docs.nap((doc) => {
return doc.ref.update(data);
});
return Promise.all(promises);
});
}
});
我强烈建议签出文档同步、异步和承诺,视频系列,因为它值得理解异步行为如何影响执行您的云功能。