用于检查newData值是否超过一定数量的Firebase规则

时间:2019-05-25 13:44:09

标签: javascript firebase firebase-realtime-database firebase-security-rules

因此,我正在向Firebase实时数据库添加规则,我需要它检查要添加的newData值是否超过一定数量,在这种情况下,这是用户在其uid之下的余额。因此,如果用户的“余额”超过了要添加的“价格”数据,则写入数据。

这是我的数据库的样子:

{
  "orders" : {
   "-Lfi6kSDLOmcvGgfiWjX" : {
        "amount" : "100",
        "price" : "0.01",
      },
  },
  "users" : {
    "GNzSciHRZAgZgIrhqIvR2vzVugj2" : {
      "balance" : "100",
    }
  }
}

这是我用来添加到数据库中的代码:

firebase.database().ref('orders').push().set ({
price: '10',
amount: '1'
});

这是规则:

   "users": {
    ".read": true,
    ".write": true
   },

 "orders": {
    ".read": true,
    ".write": "root.child('users').child(auth.uid).child('balance').val() > '0' && root.child('users').child(auth.uid).child('balance').val() > newData.child('price').val()" 
   }

一切正常,直到我添加newData.child('price').val()规则,这是规则的使用方式吗?

1 个答案:

答案 0 :(得分:0)

由于您将值存储为字符串,因此Firebase将在其上使用字典顺序和字符串比较运算符。我高度建议将数字值存储为实际数字,这样可以简化规则的推理过程:

JSON:

{
  "orders" : {
   "-Lfi6kSDLOmcvGgfiWjX" : {
        "amount" : 100,
        "price" : 0.01,
      },
  },
  "users" : {
    "GNzSciHRZAgZgIrhqIvR2vzVugj2" : {
      "balance" : 100,
    }
  }
}

JavaScript代码:

firebase.database().ref('orders').push().set ({
  price: 10,
  amount: 1
});

规则:

"orders": {
  ".read": true,
  ".write": "
    root.child('users').child(auth.uid).child('balance').val() > 0 && 
    root.child('users').child(auth.uid).child('balance').val() >= newData.child('price').val()" 
}

还要注意在最后一个表达式中从>>=的更改,因为您可能还想在用户有足够的钱时允许写操作。


更新

除此之外,您的规则本身是在orders上声明的,应该在特定顺序的下一层声明它们。

所以:

"orders": {
  "$orderId": {
    ".read": true,
    ".write": "
      root.child('users').child(auth.uid).child('balance').val() > 0 && 
      root.child('users').child(auth.uid).child('balance').val() >= newData.child('price').val()" 
  }
}