Firebase云函数:运行事务时出错
发布时间:2022-03-22 14:44:59 292
相关标签:
我正在开发一个应用程序,用户可以创建自己的列表和帖子,订阅/推荐其他用户的列表/帖子,并发表评论。
以下是我的数据库的结构:
用户创建帖子/列表=>;文档分别在“列表”和“帖子”集合下创建。
用户推荐帖子=>;在“记录后”集合和;用户的UID存储在推荐帖子的用户数组中。
用户推荐列表=>;在“列表记录”集合和;用户的UID存储在推荐列表的用户数组中。
用户订阅列表=>;在“list_subs”集合下创建一个文档,用户的UID存储在订阅用户的数组中。
用户创建评论=>;在“注释”集合下创建文档。
我正在尝试构建一个功能来阻止用户,以便删除被阻止用户的交互。i、 e.应删除“记录后”、“记录列表”、“记录列表”和“评论”中的所有相应数据。阻塞的记录应保存在“阻塞”集合中,新文档的创建会触发函数删除相应的数据。
当我运行下面的代码时,它会遇到以下问题:
- 我收到错误信息:“错误:4个截止日期\u超过:超过截止日期”
- “评论”集合中的所有文档均已成功删除,但“post_reco”和“list_reco”中的文档均未删除。
我想这与写限制有关,但问题发生在只有几十个文档需要删除时,所以我有点困惑。
有人能看一下下面的函数并告诉我哪里出了问题吗?
exports.blockUsers = functions
.firestore.document("blocks/{uid}")
.onWrite((change, context) => {
/*
Logic to extract uid (the blocker) and targetuid (the blocked). Omitted for brevity
*/
//Get the lists and posts the blocker created and comments that the blocked created on the blocker's posts
const q1 = db.collection("lists").where("uid", "==", uid);
const q2 = db.collection("posts").where("uid", "==", uid);
const q3 = db
.collection("comments")
.where("commentuid", "==", targetuid)
.where("postuid", "==", uid);
return Promise.all([q1.get(), q2.get(), q3.get()]).then((results) => {
refs = [];
results.forEach((querySnapshot) => {
querySnapshot.forEach((documentSnapshot) => {
refs.push(documentSnapshot.ref);
});
});
if (refs.length === 0) {
console.log("no changes needed");
return null;
}
/*
For post_reco, list_reco, and list_subs, the corresponding documents can either
exist or not based on whether there has been an interaction. So I wrote the code
to get the entire chunk of lists and posts the blocker created and then go one-by-one
to check whether the corresponding document exists, and remove the blocked if there is one.
I guess this is causing the issue, but don't know what exactly the problem is.
*/
return db.runTransaction((t) => {
return t.getAll(...refs).then((docs) => {
docs.forEach((doc) => {
const area = doc.ref.path.split("/")[0];
if (area === "posts") {
return db
.collection("post_reco")
.doc(doc.ref.path.split("/")[1])
.get()
.then((doc2) => {
if (doc2.exists) {
return doc2.ref.update({
post_reco_uid:
admin.firestore.FieldValue.arrayRemove(targetuid),
});
} else {
return null;
}
});
} else if (area === "lists") {
const listid = doc.ref.path.split("/")[1];
return db
.collection("list_reco")
.doc(listid)
.get()
.then((doc2) => {
if (doc2.exists) {
return doc2.ref.update({
reco_users_uid:
admin.firestore.FieldValue.arrayRemove(targetuid),
});
} else {
return null;
}
})
.then(() => {
return db
.collection("list_subs")
.doc(listid)
.get()
.then((doc3) => {
if (doc3.exists) {
return doc3.ref.update({
subs_users_uid:
admin.firestore.FieldValue.arrayRemove(targetuid),
});
} else {
return null;
}
});
});
} else {
t = t.delete(doc.ref);
}
});
});
});
});
});
谢谢
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报