Правило Firebase, чтобы проверить, превышает ли значение newData определенное количество - PullRequest
0 голосов
/ 25 мая 2019

Итак, я добавляю правила в свою базу данных 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 голосов
/ 25 мая 2019

Поскольку вы сохраняете значение в виде строки, 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()" 
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...