【问题标题】:Set a maximum number of children in Firebase在 Firebase 中设置最大子节点数
【发布时间】:2017-09-10 01:28:27
【问题描述】:

关于这个还有一些其他(较旧的)问题,但由于它们已经有几年的历史了,我很好奇是否有关于这个的更新。我想制作一个彩票动画,用户可以在其中购买彩票。一切进展顺利,但我想确保售出的门票永远不会超过一千张。它必须是服务器端,这些是我的规则:

  "Lottery": {
    ".read": "auth != null",
    ".write": "auth != null",
      "counter": {
        ".validate": "newData.isNumber() && newData.val() > 0 && newData.val() <= 1000 && ((!data.exists() && newData.val() === 1) || (newData.val() === data.val()+1))"
      },
        "tickets":{
          "root.child('Lottery/counter/').val() === someValueYouNeedItToEqual"
        }
  }

我不知道在 someValueYouNeedItToEqual 上写什么。我担心这个系统的工作。我的目标是将用户的 UID 写入服务器,如果该值(我可以在客户端搜索可用点,该值可以是 0 到 1000 之间的 Int)是免费的,则被接受。当所有点都被取走(一个节点中有 1000 个子节点)时,它应该被拒绝。我希望有人可以帮助我弄清楚所需的验证规则。谢谢。

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database firebase-security


    【解决方案1】:

    这里已经有关于 SO 的指导:Limit number of records that can be written to a path (reference other paths in security rules)

    或者您可以使用Cloud Functions for Firebase 来实现database trigger 两者:

    1. 随着孩子的来来去去,增加/减少孩子的计数(为了安全起见,在交易中)。
    2. 检查子项计数以确保新子项对添加有效,如果不是,则删除它(或其他子项)。

    【讨论】:

    • 好的,我想我会看看 Functions for Firebase,它看起来更安全一些。
    【解决方案2】:

    您收到错误是因为

    "root.child('Lottery/counter/').val()"
    

    表达式不返回布尔值。它返回存储在该引用处的任何值。您可以通过尝试类似的方法来消除错误

    "root.child('Lottery/counter/').val() === someValueYouNeedItToEqual"
    

    【讨论】:

    • 谢谢 :) 现在我需要它来确保它设置的孩子不超过 1000 个。任何想法如何做到这一点?
    • 不幸的是,没有本地方法可以从 firebase 的服务器端规则中获取子节点的数量。我能想到的最简单的方法是添加一个“numberOfTickets”引用并在每次添加票证时增加它。然后你只需要编写一个类似"root.child('numberOfTickets').val() &lt; 1000" 的规则
    猜你喜欢
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 2015-06-29
    • 2013-02-01
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多