Тестирование отсутствующих свойств в Firebase -> База данных -> Правила - PullRequest
0 голосов
/ 13 апреля 2019

В моем Firebase -> База данных -> Редактор правил у меня есть правило соответствия для операции write для курса, который проверяет, является ли свойство status одним из следующих значений:

  1. Undefined,это означает, что свойство просто отсутствует в реквизите модели, или
  2. Set, со значением 'draft' или 'complete'

Чтобы зафиксировать это, я написал следующее:

match /courses/{courseId} {
  allow write: if (resource.data.status == 'undefined' ||
                   resource.data.status != 'completed');
}

То есть, write разрешено, если у курса нет свойства status или оно не равно «завершено».Нет проблем со второй частью условия. Проблема в том, что первая часть всегда вызывает типичную ERROR FirebaseError: отсутствуют или недостаточные разрешения .

Я пробовал каждый из следующих вариантовдля первой части, но безуспешно:

resource.data.status == null
resource.data.status == undefined
resource.data.status == 'undefined'
typeof(resource.data.status) == undefined
typeof(resource.data.status) == 'undefined'

И, === просто не синтаксически допустим в редакторе.Любая идея, как проверить отсутствующие свойства и получить правильное значение true / false?

1 Ответ

1 голос
/ 13 апреля 2019

Я недавно нуждался в этом в проекте и придумал эту функцию:

function isNotExisting(request, resource, key) {
  return !(key in request.resource.data) && (!exists(resource) || !(key in resource.data));
}

Основной трюк использует key in resource.data или key in request.resource.data, который проверяет, существует ли данный ключ в документе послеили перед операцией.

...