Firebase:在5分钟间隔内没有写入操作时更新数据库

时间:2017-03-10 11:47:02

标签: angular firebase

我想写一个数据库规则,我需要在没有对该记录进行写操作时更新特定记录的密钥。

场景:一个协作记事本,其中多个用户可以更新文本。当一个用户开始写入时,通过启用lock: true锁定其他用户。因此,在释放锁之前,其他人将无法更新。如果用户开始写作并且离开较长时间或关闭应用程序,则该笔记的状态始终为lock: true,永远不会让其他人更新!我该如何克服这种情况?

如果5分钟没有写入操作,是否可以使用数据库规则将状态更改为lock: false?或者我应该在应用程序本身处理这个问题

1 个答案:

答案 0 :(得分:4)

是否可以使用数据库规则将状态更改为锁定:如果5分钟内没有任何写入操作,则为false?否。

以下是您可以做的事情。(我首先解决规则选项,因为这是您的问题的目标,但第二个选项可能是更合适。你的选择。)

假设您的数据库结构看起来有点像这样;

root: {
  notes: {
    $note: {
      locked: true,
      lockedBy: uid,
      lockedOn: 1489181073472  // Time in milliseconds since UNIX epoch
    }
  }
}

如果锁已开启超过5分钟,您可以使用下面的数据库规则允许其他用户覆盖注释数据 。基本上,这将忽略locked: true。这样做的缺点是,如果你有任何倾听false值的听众,那么他们就不会被召唤。

{
"rules": {
    "notes": {
      "$note": {
        ".read" : true,
        ".write": "data.child('lockedBy').val() === auth.uid || data.child('lock').val() === false || (data.child('lockedOn').val() + 300000) < now"
      }
    }
  }
}

一步一步:这些规则做了什么(写入规则,读取规则非常自我解释):

此规则允许放置锁定的人始终能够写:

data.child('lockedBy').val() === auth.uid

此规则可确保人们可以在锁定为false时写入:

data.child('lock').val() === false

最后一个确保人们可以写,如果lockedOn至少有5分钟的时间。

(data.child('lockedOn').val() + 300000) < now

您显然希望添加更多规则以确保用户经过身份验证等等,但这不属于问题范围。

仍然,这一切都没有达到你想要的效果。如果您希望能够检测锁是否已打开超过5分钟,然后删除该锁。那么你很幸运,因为Firebase团队刚刚(昨天,什么时间)发布了 Firebase云功能的测试版,它恰好是你想要的完美选择。基本上,函数为您提供了一个Node.js环境,您可以在其中运行与客户端代码类似的功能,仅在服务器上运行。您可以编写一个功能来监控当前锁定的所有音符,并确保它们没有被锁定超过5分钟。如果是,您可以更新它们。这样您就可以在不需要客户端的情况下做您想做的事。

链接:

Introducing Cloud Functions for Firebase

Functions docs

Understand Firebase Realtime Database Rules