javascript - 火存储 : onWrite Convert Keywords Array String to Lower Case Items

标签 javascript firebase google-cloud-firestore google-cloud-functions

场景

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

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

    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

问题

一旦删除关键字数组中的项目,我就会经历无限循环

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

谢谢。

最佳答案

解决方案

上述问题的问题是我试图从关键字数组字段中删除一个项目。删除项目时,我指的是原始项目,而不是指修改后的 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 }
              );
            }

关于javascript - 火存储 : onWrite Convert Keywords Array String to Lower Case Items,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57629567/

相关文章:

javascript - 我可以在 firestore 中查询嵌套文档值吗?

firebase - 如何更新已全部插入列表的Map中的嵌套列表?例如。 List < map <字符串,动态>>

javascript - 从函数内部更改全局变量

json - 在 JSON 中从 Firebase 检索数据 - Swift

javascript - 使用 Polymer 函数附加到 div

javascript - Next.js 身份验证示例 - 基于身份验证的重新路由,环绕其他功能

javascript - 无法读取 undefined 的属性 'ready' ;然后是区域 : <root> ; Task: Promise. ;值:类型错误:无法读取未定义的属性 'ready'

javascript - 如何在Firestore中不断地将对象添加到嵌套集合中

javascript - 如何将变量从 javascript 表单传递给 python(在同一台计算机上)?

Javascript返回函数到函数定义