【问题标题】:Firestore + cloud function: How to tell if it's a create, update, or delete eventFirestore + 云功能:如何判断它是创建、更新还是删除事件
【发布时间】:2018-05-09 23:47:04
【问题描述】:

我想编写一个由 Firestore 写入事件触发的 Firebase 云函数。在函数内部,我必须知道 write 是否实际上是一个创建、更新或删除函数。逻辑略有不同,但我不想复制和粘贴三个不同的事件处理程序。如何判断它是哪种事件类型?

云文档让我很困惑。

Event 的文档说,在 FireStore 的情况下,事件实际上是一个 DeltaDocumentSnapshot。

https://firebase.google.com/docs/reference/functions/functions.Event

DeltaDocumentSnapshot 的文档表明该类没有关于事件本身的信息(例如,创建、更新或删除的指示),而只有目标文档:

https://firebase.google.com/docs/reference/functions/functions.firestore.DeltaDocumentSnapshot

我找到了示例,作者似乎通过检查当前或以前的文档是否存在来推断创建/更新/删除。我试过了,但我得到了一个错误。

https://github.com/firebase/functions-samples/blob/master/child-count/functions/index.js#L30

这是我尝试过的:

exports.updateLikeCount = functions.firestore
.document('likes/{likeId}').onWrite((event) => {
    if (event.data.data().exists()) {
      // Looks like the document still exists. It must be an update or create.
    }

    if (event.data.previous.data().exists()) {
      // Looks like the document existed before. It must be an update or delete.
    }

该代码因以下错误而失败:

TypeError: event.data.exists is not a function

【问题讨论】:

  • 您从child-count 链接的代码使用event.data.exists()。您在其中添加了一个额外的data(),这不起作用。

标签: google-cloud-functions google-cloud-firestore


【解决方案1】:

我尝试了几种不同的方法。下面的版本好像可以用,不知道对不对。

var exists = event.data.exists;`
var hasExisted = (event.data.previous != null) && event.data.previous.exists;
var isCreate = (exists && !hasExisted);
var isDelete = (!exists && hasExisted);

【讨论】:

    【解决方案2】:

    使用 firebase-functions 1.0 版的 new release,检查此内容的函数可能如下所示(在 typescript 中):

    import { Change } from 'firebase-functions';
    
    export function checkEventType(change: functions.Change<FirebaseFirestore.DocumentSnapshot>): string {
        const before: boolean = change.before.exists;
        const after: boolean = change.after.exists;
    
        if (before === false && after === true) {
            return 'create';
        } else if (before === true && after === true) {
            return 'update';
        } else if (before === true && after === false) {
            return 'delete';
        } else {
            throw new Error(`Unkown firestore event! before: '${before}', after: '${after}'`);
        }
    }
    

    我已经测试过这个函数,并且与 .onWrite() 事件结合使用效果很好。

    【讨论】:

    • P.S.这里的相等检查是多余的,因为两个值都将始终是 boolean。 (应该只是if (!before &amp;&amp; after) 而不是if (before === false &amp;&amp; after === true)
    • @Edric 仅适用于较新版本的 firebase-funcitons。但我认为before === false &amp;&amp; after === true!before &amp;&amp; after 更容易理解。我想这只是一个意见:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    相关资源
    最近更新 更多