Как я могу создать правило, которое запрещает пользователям добавлять дату, которая больше, чем сейчас - PullRequest
1 голос
/ 21 апреля 2019

Я пытаюсь добавить в свою базу данных в реальном времени правило, которое не позволит пользователям вставлять дату, которая больше, чем сейчас.Даты, которые у меня есть в моей базе данных, были преобразованы в строку.

вот пример даты в моей базе данных:

"Вс 21 апреля 2019 14:14:00GMT + 0200 (heure d'été d'Europe centrale) "

Ниже вы найдете пример моих текущих правил.

Любая подсказка о том, как я могу сделать проверкуотсюда?Спасибо

 {
    /* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */
    "rules": {
      "users":{
        "$uid":{
          ".read": "auth.uid == $uid",
          ".write": "auth.uid == $uid",
          "exercices":{
          "developpeIncline":{
                "$developpeInclineId":{
                    "date":{
                     ".validate":"newData.val() <= now"  // blocks everything at the moment
                  },
                 "reps":{
                   ".validate":"newData.val().length < 3"
                 }
              }
          }
          }
        }
      }
    }
  }

1 Ответ

0 голосов
/ 21 апреля 2019

Переменная now в правилах безопасности Firebase задокументирована как:

Содержит количество миллисекунд с начала Unix в соответствии с серверами базы данных Firebase Realtime.

Поскольку ваша дата хранится в виде строки, ваши правила теперь сравнивают различные типы:

"Sun Apr 21 2019 14:14:00 GMT+0200 (heure d’été d’Europe centrale)" <= 1555855344955

Это сравнение никогда не будет верным, поскольку сравнение строк и чисел никогда не дает полезного результата.

Вам нужно будет написать код, чтобы получить значения одного типа, чтобы можно было сравнивать. А поскольку даты в виде строк не легко сопоставимы, это означает, что вам нужно преобразовать строку обратно в дату или в числовую метку времени.

Я не думаю, что это возможно в правилах безопасности Firebase. Но даже если бы это было возможно, я настоятельно рекомендую выбрать лучший подход. Сохраните свою дату как метку времени:

developpeInclineRef.child("timestamp").set(date.getTime());

или

developpeInclineRef.child("timestamp").set(Date.now());

При этом сравнение становится тривиальным:

"timestamp": {
  ".validate":"newData.val() <= now"
},

Если вы также хотите сохранить дату в формате отображения, попробуйте сохранить ее в двух форматах: в качестве временной метки и в виде строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...