我想为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? :(
答案 0 :(得分:1)
我不相信root
是在Firestore DocumentReference
(docs)中定义的。相反,我相信你想使用firestore
(docs),它获得顶级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})。得到()
一样的电话。如果它对某人有帮助:))