我想编写一个由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.
}
该错误失败了:
TypeError: event.data.exists is not a function
随着Firebase-funnctions 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}'`);
}
}
我已经测试了此功能,并且与.onwrite()事件结合使用。
我尝试了一些不同的事情。下面的版本似乎可以使用,但我不知道它是否正确。
var exists = event.data.exists;`
var hasExisted = (event.data.previous != null) && event.data.previous.exists;
var isCreate = (exists && !hasExisted);
var isDelete = (!exists && hasExisted);