云功能:Firestore触发器

时间:2017-11-20 18:40:41

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

我想为Firestore编写云函数,它将减少task.elapsedCount,并在两个并行线程中使user.points + = 3:

exports.taskDoneFunc = functions.firestore
.document('/tasks/{taskId}')
.onUpdate(event => {

    const taskRef = event.data.ref;
    const root = taskRef.root;

    return taskRef.get()
        .then(taskSnap => {

            let task = taskSnap.data();

            task.elapsedCount -= 1;

            taskRef.set(task, {merge: true})

            return root.document('/users/${task.taskOwner_uid}').get()

        }).then(userSnap => {

            let user = userSnap.data();

            user.points += 3;

            return userSnap.ref.set(user)

        })
});

第一个Promise工作正常,我看到任务Firestore“任务”文档中的更改,但第二个说“无法读取未定义的属性'文档'。” 我没有找到任何关于Fire Functions for Firestore数据库触发器的干净示例,这是疯狂的Beta? :(

2 个答案:

答案 0 :(得分:1)

我不相信root是在Firestore DocumentReferencedocs)中定义的。相反,我相信你想使用firestoredocs),它获得顶级Firestore数据库:

exports.taskDoneFunc = functions.firestore
.document('/tasks/{taskId}')
.onUpdate(event => {

    const taskRef = event.data.ref;
    const db = taskRef.firestore;
    const task;

    return taskRef.get()
        .then(taskSnap => {
            task = taskSnap.data();
            task.elapsedCount -= 1;
            return taskRef.set(task, {merge: true})
        }).then(() => {
            return db.collection('users').doc(task.taskOwner_uid).get();
        }).then(userSnap => {
            let user = userSnap.data();
            user.points += 3;
            return userSnap.ref.set(user)
        })
});

我认为还有一个潜在的竞争条件有两个异步函数(该集合后跟get)。

答案 1 :(得分:0)

我刚刚想出如何在Firestore中使用函数:只是

  

admin.firestore()。DOC(/用户/ $ {UID})。得到()

一样的电话。如果它对某人有帮助:))