返回

Firebase云函数:运行事务时出错

发布时间:2022-03-22 14:44:59 281

我正在开发一个应用程序,用户可以创建自己的列表和帖子,订阅/推荐其他用户的列表/帖子,并发表评论。

以下是我的数据库的结构:

  1. 用户创建帖子/列表=>;文档分别在“列表”和“帖子”集合下创建。

  2. 用户推荐帖子=>;在“记录后”集合和;用户的UID存储在推荐帖子的用户数组中。

  3. 用户推荐列表=>;在“列表记录”集合和;用户的UID存储在推荐列表的用户数组中。

  4. 用户订阅列表=>;在“list_subs”集合下创建一个文档,用户的UID存储在订阅用户的数组中。

  5. 用户创建评论=>;在“注释”集合下创建文档。

我正在尝试构建一个功能来阻止用户,以便删除被阻止用户的交互。i、 e.应删除“记录后”、“记录列表”、“记录列表”和“评论”中的所有相应数据。阻塞的记录应保存在“阻塞”集合中,新文档的创建会触发函数删除相应的数据。

当我运行下面的代码时,它会遇到以下问题:

  1. 我收到错误信息:“错误:4个截止日期\u超过:超过截止日期”
  2. “评论”集合中的所有文档均已成功删除,但“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);
            }
        });
        });
    });
    });
});

谢谢

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
相关帖子
下一篇
vue.js-运行Vue开发服务器 2022-03-22 13:47:43