Для начала, одна проблема, с которой вы сталкиваетесь, заключается в том, что ваша первая ссылка на базу данных нацелена на 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"
}
}
}
}
}
* Отказ от ответственности: непроверенный код и правила, например, только