我们目前通过使用队列的功能来处理响应来做到这一点。安全规则强制用户将其用户 ID 作为请求的属性写入,并且他们可能只读取队列中包含其 ID 的项目。
安全规则(客户端的相关部分):
"queue": {
"tasks": {
".indexOn": [
"_state"
],
"$id": {
".read": "auth !== null && ((!data.exists()) || (data.child('user').val() === auth.uid))",
".write": "auth !== null && ((!data.exists() && newData.child('user').val() === auth.uid && newData.child('_state').val() === '<start state goes here>') || (data.exists() && data.child('user').val() === auth.uid && !newData.exists()))"
}
}
}
这允许客户端创建新作业和删除作业,但不能修改其内容。
为确保客户端只能在开始状态添加条目,您需要填写<start state goes here>
上述规则。
规格
{
"error_state" : "error",
"finished_state" : "finished",
"in_progress_state" : "in_progress"
}
您需要一个非默认规范来指定完成状态,客户端可以观察该状态以了解请求何时得到解决。
其他注意事项
不能依赖客户端来清理像这样使用的任务。您应该将服务器配置为在超时后自动删除响应。例如,用户可能会在返回响应之前刷新或离开页面。这可能只发生不到 1% 的时间,但如果队列填满了已完成的响应,您的性能将会下降。