Получение 'FirebaseError: Отсутствует или недостаточно разрешений.' из onsnapshot ошибка, когда пользователь имеет правильные разрешения - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь создать ссылку на документ, настроить прослушиватель onsnapshot, сохранить документ и затем загрузить файл, который вызовет функцию облака, которая будет обновлять документ, который я слушаю.Но onSnapshot выдает ошибку разрешений «FirebaseError: отсутствуют или недостаточны разрешения».после того, как снимок запустился один раз (я думаю, для начального состояния).

Я попытался запустить симуляции доступа и записи данных в консоли Firebase, и она работает без ошибок

const db = window.firebase.firestore()
const newBaseRef = db.collection('base').doc()

newBaseRef.onSnapshot(doc => {
  console.log('Current data: ', doc.data())
}, function (error) {
  throw error // THIS ALWAYS GETS HIT
})

newBaseRef.set({
  uid: window.firebase.auth().currentUser.uid,
  createdAt: window.firebase.firestore.FieldValue.serverTimestamp()
})

вот мои правила безопасности

service cloud.firestore {
  match /databases/{database}/documents {
    match /printset/{document=**} {
      allow read, update, delete: if request.auth.uid == resource.data.uid
      allow create: if request.auth.uid != null;
    }

    match /file/{document=**} {
      allow read, update, delete: if request.auth.uid == resource.data.uid
      allow create: if request.auth.uid != null;
    }

    match /base/{document=**} {
      allow read, update, delete: if request.auth.uid == resource.data.uid
      allow create: if request.auth.uid != null;
    }
  }
}

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

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

newBaseRef.set() return Promise.

Поэтому, когда вызывается newBaseRef.onSnapshot(), newBaseRef.data().uid еще не установлено.

См .:

Вы должны позвонить newBaseRef.onSnapshot() после Promise.resolve().

const db = window.firebase.firestore()
const newBaseRef = db.collection('base').doc()


newBaseRef.set({
  uid: window.firebase.auth().currentUser.uid,
  createdAt: window.firebase.firestore.FieldValue.serverTimestamp()
}).then(() => {
  newBaseRef.onSnapshot(doc => {
    console.log('Current data: ', doc.data())
  }, function (error) {
    throw error // THIS ALWAYS GETS HIT
  })
})

и более.

Если вы хотите только вставить, то выследует использовать newBaseRef.add({}).

Если вы хотите вставить или удалить или вставить (заменить все данные), вам следует использовать newBaseRef.set({}).

Если вы хотите вставить обновление или обновить, то вам следует использовать newBaseRef.set({}, {merge, true}).

Если вы хотите только обновить, вам следует использовать newBaseRef.update({}).

Если вы хотите вставить обновление или обновить, измените правила безопасности на следующий параметр.

service cloud.firestore {
  match /databases/{database}/documents {

    match /printset/{document=**} {
      allow read, update, delete: if request.auth.uid == resource.data.uid
      allow create: if request.auth.uid != null;
    }

    match /file/{document=**} {
      allow read, update, delete: if request.auth.uid == resource.data.uid
      allow create: if request.auth.uid != null;
    }

    match /base/{document=**} {
      allow read, delete: if request.auth.uid == resource.data.uid
      allow update: if resource == null || request.auth.uid == resource.data.uid
      allow create: if request.auth.uid != null;
    }
  }
}
0 голосов
/ 10 мая 2019

Использовать /base/{baseId}

/base/{document=**} Используется для соответствия base subcollections

например./base/{someBaseId}/someCollection/{someCollectionId}

Еще одна вещь, на которую следует обратить внимание, - это ошибка прав доступа при вызове newBaseRef.set

...