首页 > 解决方案 > Firestore:onWrite 将关键字数组字符串转换为小写项目

问题描述

设想

我希望能够在更新或创建操作时将关键字数组更改为小写,但是在删除时我想提前退出函数执行。

到目前为止,我已经完成了以下操作

    import * as functions from "firebase-functions";
    export const onCourseCreate = functions.firestore.document("courses/{id}")
.onWrite((snap, context) => {
      return changeToLowerCase(snap);
    });

    function changeToLowerCase(
snap: functions.Change<FirebaseFirestore.DocumentSnapshot>
) {
      if (!snap.before.exists) return null;
      const original = snap.before.data();
      if (original == undefined) return;

      const _keywords: string[] = original.keywords;
      const keywords: string[] = [];
      _keywords.forEach((item: string) => {
        const lowercase = item.toLowerCase();
        keywords.push(lowercase);
      });

      return snap.after.ref.set(
        {
          keywords
        },
        { merge: true }
      );
    }

我也累snap.after.exists

问题

一旦我删除了关键字数组中的一个项目,我就会经历infinite loop

任何建议我都会非常感激。

谢谢。

标签: javascriptfirebasegoogle-cloud-firestoregoogle-cloud-functions

解决方案


解决方案

上述问题的问题是我试图从关键字数组字段中删除一个项目。删除项目时,我指的是原始项目,而不是我应该参考修改后的snap.after.data().

这是一个非一般问题,它是我的特定用例所特有的。对于感兴趣的人,这里是最终的解决方案:

            import * as functions from "firebase-functions";
            export const onCourseCreate = functions.firestore.document("courses/{id}")
    .onWrite((snap, context) => {
              return changeToLowerCase(snap);
            });

            function changeToLowerCase(
snap: functions.Change<FirebaseFirestore.DocumentSnapshot>
) {
              if (!snap.after.exists) return null;

              const original = snap.before.data();
              const modified = snap.after.data();

              if (modified == undefined) return null;

              if (original != undefined && modified.keywords.length < original.keywords.length) 
        return null;

              const _keywords: string[] = modified.keywords;
              const keywords: string[] = [];
              _keywords.forEach((item: string) => {
                const lowercase = item.toLowerCase();
                keywords.push(lowercase);
              });

              return snap.after.ref.set(
                {
                  keywords
                },
                { merge: true }
              );
            }

推荐阅读