Тестирование отсутствующих свойств в Firebase -> База данных -> Правила

#firebase #google-cloud-firestore #firebase-security

#firebase #google-cloud-firestore #firebase-безопасность

Вопрос:

В моем редакторе Firebase -> Database -> Rules у меня есть правило соответствия для write op в курсе, которое проверяет, является ли status свойство либо:

  1. Не определено, что означает, что свойство просто отсутствует в реквизитах модели, или
  2. Установить, со значением «черновик» или «завершено»

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

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

То есть a write разрешено, если у курса нет status свойства или свойство не равно «завершено».
Со второй частью условия проблем нет, проблема в том, что первая часть всегда вызывает типичную ОШИБКУ 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:

Недавно мне понадобилось это в проекте, и я придумал эту функцию:

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

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

Комментарии:

1. Имеет смысл, как только я прочитаю ваш ответ! Переписывание проблемной части, как !('status' in resource.data) это было сделано для меня! Спасибо, Фрэнк 🙂