Firestore +云功能:如何判断它是创建,更新还是删除事件

Tho*_*her 5 google-cloud-functions google-cloud-firestore

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

云文档对我来说非常混乱.

事件的文档说,在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.
    }
Run Code Online (Sandbox Code Playgroud)

该代码失败并出现此错误:

TypeError: event.data.exists is not a function
Run Code Online (Sandbox Code Playgroud)

Dau*_*eDK 8

随着firebase-functions 1.0版的版本,检查这个的函数可能看起来像这样(在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}'`);
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Tho*_*her 2

我尝试了一些不同的事情。下面的版本似乎可以工作,但我不知道它是否正确。

var exists = event.data.exists;`
var hasExisted = (event.data.previous != null) && event.data.previous.exists;
var isCreate = (exists && !hasExisted);
var isDelete = (!exists && hasExisted);
Run Code Online (Sandbox Code Playgroud)