我必须选择在firestore触发函数中进行firestore读写操作还是在api端点中直接调用firestore ?&



在此程序中,当创建任务并将其分配给用户时,Firestore将增加numberOfTasksAssigned字段。

选项1:在express API端点中编写Firestore文档

try {
const newTaskRef = db
.collection("organizations")
.doc(req.user.userData.organization)
.collection("tasks")
.doc();
await newTaskRef.set({
taskId: newTaskRef.id,
name,
user: {
userId,
username
},
organization: req.user.userData.organization,
project: {
projectId: req.body.project.projectid,
name: req.body.project.name
},
completed: false,
});
// await db.doc(`/organizations/${req.user.displayName.slice(-20)}/users/${userId}`).update({
//   numberOfTasksAssigned: admin.firestore.FieldValue.increment(1)
// })
} catch (err) {
res.status(500).json({ error: err, message: "Something went wrong" });
}

选项2:在Firestore触发器函数中写入Firestore文档

exports.updateUserTasks = functions.region("asia-east2").firestore.document(`/organizations/{organizationid}/tasks/{taskid}`)
.onCreate(async (snap, context) => {
try {
await db.doc(`/organizations/${context.params.organizationid}/users/${snap.data().user.userId}`).update({
numberOfTasksAssigned: admin.firestore.FieldValue.increment(1)
})
} catch (err) {
console.error(err);
return res.status(500).json({error: err, message: "Something went wrong"})
}
})

乍一看,我能看到的唯一区别(通过您提供的信息)是一个潜在的访问权限问题,用户可以使用它来减少numberOfTasksAssigned的值。

我们不知道你的express API端点是否通过Cloud Functions实现,如果你已经通过安全规则实现了一些访问权限,但是使用选项1,似乎用户可以直接修改他/她的用户文档并减少numberOfTasksAssigned的值。

使用云函数做增量,并通过安全规则禁止用户文档的直接更新将避免这个问题:因为云函数使用管理SDK,他们绕过安全规则。


另一点需要注意的是,您可能应该在原子操作中执行两次写操作。

相关内容

  • 没有找到相关文章

最新更新