Как сравнить логический индекс из firebase по ref () - PullRequest
0 голосов
/ 20 марта 2019

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

Моя проблема в том, что я не могу понять, как получить значение индекса (которое должно быть либо истинным, либо ложным) индекса matchSettings / locked из firebase.

Метод работает правильно, но я хотел бы теперь остановить проигрыватель от редактирования настроек после первого вызова метода.

  changeSettings(time, increment) : void {
    let timePerRound = time;
    let decrease= increment;
    this.db.database.ref(`users/${this.gameId}/matchSettings/locked`).once('value').then( s => {
      if (s == true) {
        // dont allow another update
      }
    })
    this.db.object(`games/${this.gameId}/matchSettings`).update({
      timePerRound: time, decrease: increment, locked: true
    });
    console.log("game settings updated")
  }

Вот некоторые printscrns, которые показывают базу данных.

http://prntscr.com/n0n9ef <--- данные не заблокированы, поэтому можно изменять настройкиодин раз.<a href="http://prntscr.com/n0n9ov" rel="nofollow noreferrer">http://prntscr.com/n0n9ov <--- Я теперь вызвал changeSettings (45,45), но он также изменит заблокированный на = true.</p>

1 Ответ

0 голосов
/ 21 марта 2019

Для начала, одна проблема, с которой вы сталкиваетесь, заключается в том, что ваша первая ссылка на базу данных нацелена на users, тогда как она должна нацеливаться на games.Помимо этого ...

Вы должны переместить вызов обновления в первый результат, полученный вами из базы данных, чтобы вы знали, разрешено ли обновление:

changeSettings(time, increment) : void {
    let timePerRound = time;
    let decrease= increment;

    this.db.database.ref(`games/${this.gameId}/matchSettings/locked`).once('value')
    .then( s => {
        if (s == true) {
            // dont allow another update
        } else {
            // Yes allow the update
            this.db.object(`games/${this.gameId}/matchSettings`).update({
                timePerRound: time, decrease: increment, locked: true
            });
            console.log("game settings updated")
        }
    })
}

Конечно, этокод может быть оптимизирован, это довольно уродливый оператор if / else ... но давайте оставим его базовым для понимания.

Обратите внимание, что ЭТО НЕ ХОРОШО, не совсем.Это всего лишь безопасность на входе ... это иллюзия.Если вы действительно хотите предотвратить изменение настроек игры, вам следует реализовать правила базы данных для этого.Например, что-то вроде:

{
    "rules": {
        "games": {
            "$gameId": {
                "matchSettings": {
                    // Allow writing to this node only if...
                    // If the old data doesn't exist... (allow create attempts)
                    // Or if the old data's "locked" property is false
                    ".write": "!data.exists() || data.child('locked').val() == false"
                }
            }
        }
    }
}

* Отказ от ответственности: непроверенный код и правила, например, только

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