Итак, какой смысл иметь .exists()
, если обещание всегда не выполняется, потому что документ не найден (на самом деле он еще не существует).
match /conversations/{conversationId} {
allow read: if request.auth.uid in resource.data.participants
}
Это будет запрос (минималистичный пример)
store.conversations
.doc( conversationId )
.get()
.then( async snapshot => {
if ( !snapshot.exists )
data = await dispatch( startConversation( participant ) )
}
.catch( console.err )
Эта отправка никогда не будет инициирована, если документ не существует, поскольку правила безопасности предполагают, что request.auth.uid
будет находиться в массиве resource.data.participants
, что иногда не так.
Единственный способ исправить это - изменить правила безопасности, чтобы разрешить чтение, когда документ не существует. Но это просто кажется нелогичным.
match /conversations/{conversationId} {
function conversationExists(conversationId) {
return exists(/databases/$(database)/documents/conversations/$(conversationId))
}
allow read: if request.auth.uid in resource.data.participants || !conversationExists(conversationId)
}
Я бы рассмотрел проблему в пределах .catch()
, но я не могу знать, является ли проблема, связанная с отсутствием документа, или какой-либо другой причиной, вызвавшей ее (таймаут, проблемы с сетью и т. Д.).
Есть ли какие-либо подсказки относительно того, что считается наилучшей практикой в этом случае?