TLDR : Что означает request.resource.data.size()
в правилах пожарного хранилища при записи, скажем, некоторых логических значений и вложенного объекта в документ? Не уверен, что документы означают " записей на карте" (https://firebase.google.com/docs/reference/rules/rules.firestore.Resource#data, https://firebase.google.com/docs/reference/rules/rules.Map), и мои предположения оказываются неверными при тестировании в имитаторе правил (аналогичная проблема с request.resource.data.keys().size()
).
Более длинная версия : возникает проблема в правилах Firestore, когда невозможно обновить данные должным образом (несмотря на аналогичные тесты, работающие в имитаторе правил). Сузили задачу до точки, где можно увидеть, что это правило, проверяющее на request.resource.data.size()
равен некоторому числу.
Пример данных, передаваемых в пожарный склад update
, выглядит как
Object {
"parentObj": Object {
"nestedObj": Object {
"key1": Timestamp {
"nanoseconds": 998000000,
"seconds": 1536498767,
},
},
},
"otherKey": true,
}
где отметка времени генерируется с помощью firebase.firestore.Timestamp.now()
.
Похоже, что это нормально работает в симуляторе правил, но не для реальных данных при выполнении
let obj = {}
obj.otherKey = true
// since want to set object key name dynamically as nestedObj value,
// see https://stackoverflow.com/a/47296152/8236733
obj.parentObj = {} // needed for adding nested dynamic keys
obj.parentObj[nestedObj] = {
key1: fb.firestore.Timestamp.now()
}
firebase.firestore.collection('mycollection')
.doc('mydoc')
.update(obj)
Среди некоторых других правил я использую правило request.resource.data.size() == 2
, и это, кажется, правила, которые вызывают ошибку отказа в разрешении (так как при комментировании этих правил все снова работает). Можно было бы подумать, что, поскольку объект передается с 2 (верхними уровнями) ключами, то request.resource.data.size()
= 2, но это, очевидно, не так (и при этом количество ключей в переданном объекте не является общим) (аналогичная проблема с request.resource.data.keys().size()
). Так что есть длинный пример для короткого вопроса. Было бы очень полезно, если бы кто-то мог объяснить мне, что здесь происходит не так.