Firestore DocumentSnapshot существует проблема с правилами безопасности - PullRequest
0 голосов
/ 05 марта 2019

Итак, какой смысл иметь .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(), но я не могу знать, является ли проблема, связанная с отсутствием документа, или какой-либо другой причиной, вызвавшей ее (таймаут, проблемы с сетью и т. Д.).

Есть ли какие-либо подсказки относительно того, что считается наилучшей практикой в ​​этом случае?

...