Uncaught Ошибка в onSnapshot: Ошибка: отсутствуют или недостаточные разрешения на signOut () - PullRequest
0 голосов
/ 03 декабря 2018

Я использую vuex и firebase для реализации аутентификации пользователя, следуя инструкции vuegram .Я пробовал много способов отсоединить слушателей Firebase, единственное, что останавливает предупреждение об ошибке, это следующее:

var unsubscribe=fb.auth.onAuthStateChanged(user=>{
    if(user){
        store.commit('setCurrentUser',user)
        store.dispatch('fetchUserProfile')

        fb.usersCollection.doc(user.uid).onSnapshot(doc => {
            store.commit('setUserProfile', doc.data())
        })
    }
})
unsubscribe();

Однако приведенный выше код просто останавливает предупреждение в signOut (), я больше не могу обновлять данные.

Мой файл store.js:

var unsubscribe=fb.auth.onAuthStateChanged(user=>{
    if(user){
        store.commit('setCurrentUser',user)
        store.dispatch('fetchUserProfile')

        fb.usersCollection.doc(user.uid).onSnapshot(doc => {
            store.commit('setUserProfile', doc.data())
        })
    }
})

export const store=new Vuex.Store({
    state:{
        currentUser:null,
        userProfile:{}
    },
    actions:{
        clearData({commit}){
            commit('setCurrentUser',null)
            commit('setUserProfile', {})
        },
        fetchUserProfile({ commit, state }) {
             fb.usersCollection.doc(state.currentUser.uid).get().then(res => {
                commit('setUserProfile', res.data())

            }).catch(err => {
                console.log(err)
            })
        },
        updateProfile({ commit, state }, data) {
            let displayName = data.displayName

            fb.usersCollection.doc(state.currentUser.uid).set({
                displayName: displayName
            }, {merge:true}).then(function() {
                alert("Document successfully written!");
            })
            .catch(function(error) {
                alert("Error writing document: ", error);
            });
        }
    },
    mutations:{
        setCurrentUser(state, val) {
            state.currentUser = val
        },
        setUserProfile(state, val) {
            state.userProfile = val
        }
    }
})

Метод signOut:

signOut: function(){
        fb.auth.signOut().then(()=> {
            this.$store.dispatch('clearData')
            this.$router.push('login')
        }).catch(function(error) {
            console.log(error);
        });
    }

Правило моей базы данных:

allow read, write: if request.auth.uid!=null;

1 Ответ

0 голосов
/ 03 декабря 2018

Поскольку при выходе из системы все еще активен прослушиватель, система обнаруживает, что клиент потерял разрешение на чтение этих данных, и отклоняет прослушиватель.Это означает, что вам необходимо удалить прослушиватель перед выходом из системы, чтобы предотвратить появление сообщения об ошибке.

См. Документацию об отключении прослушивателей . Сначала вы получаете ссылку на функцию отмены подписки при подключении прослушивателя.:

unsubscribe = fb.usersCollection.doc(user.uid).onSnapshot(doc => {
    store.commit('setUserProfile', doc.data())
})

И затем вызвать эту функцию перед выходом из системы:

signOut: function(){
    unsubscribe();
    fb.auth.signOut().then(()=> {
        this.$store.dispatch('clearData')
        this.$router.push('login')
    }).catch(function(error) {
        console.log(error);
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...