Ionic AngularFireDatabase говорит, что не авторизован, хотя правила открыты - PullRequest
0 голосов
/ 16 мая 2018

Обзор

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

Я начал создавать эту текущую реализацию, следуя этому руководству по YouTube . После ошибок в устаревшем FirebaseListObservable я изменил своего провайдера в соответствии с этой информацией об обновлении . Я также попытался использовать стандартные правила открытого Firebase, а также те, которые они рекомендуют для «Разрешить все» в документации Firebase .

Средний

provider code

Сообщение об ошибке

Error Message

Правила Firebase

Открытая по умолчанию версия правил, которая также не работала, имела строку как allow read, write;

Firebase Rules

База данных

The Data

Другая, возможно, актуальная информация

Точно так же, как можно увидеть 1 минуту в упомянутом учебнике YouTube , я звоню initializeApp(firebaseConfig) при импорте моего app.module.ts, используя информацию, полученную при нажатии «Добавить Firebase в ваше веб-приложение "

Я использую angularfire2@5.0.0-rc.8.0, который я установил с npm install angularfire2. Когда я только что запустил npm list, он дал мне следующие два предупреждения, которые могут иметь отношение к проблеме. Я использую @angular/common@5.2.10 и @angular/core@5.2.10

нпм ERR! отсутствует peer dep: @ angular / common @ ^ 6.0.0, требуется angularfire2@5.0.0-rc.8.0 нпм ERR! отсутствует peer dep: @ angular / core @ ^ 6.0.0, требуется angularfire2@5.0.0-rc.8.0

Ответы [ 2 ]

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

Как упоминает @ brenthompson2, я делюсь этим методом, используя Firestore (бета) вместо

в app.module.ts

import { AngularFirestoreModule } from 'angularfire2/firestore';

...
@ngModule({
...
imports: [
...
    AngularFireModule.initializeApp(environment),
    AngularFirestoreModule,
  ],
})

и в любом угловом модуле или инъекциях

  constructor(private store:AngularFirestore) {

  }
  ...

  this.store.doc<any>(`users/${uid}`).snapshotChanges().subscribe(
    data=>{console.log(data.payload.data())}
  );


Не так уж отличается от firebase2 / database

0 голосов
/ 17 мая 2018

Решение

Проблема заключалась в том, что на панели мониторинга Firebase я настраивал базу данных Cloud Firestore (BETA), а не базу данных Realtime Database. После перехода на использование подходящей базы данных и установки правил я смог получить данные как из хранилища, так и из базы данных реального времени, используя базовую библиотеку Firebase (не нуждался в angularfire2).

Пример рабочего кода

В этом примере я получаю снимок корневого узла, а затем, основываясь на ключе этого узла, перебираю снимки каждого дочернего узла и сохраняю .val() в соответствующем массиве. (примечание: расположение данных в новой базе данных отличается от формата на скриншоте с вопросом)

import * as firebase from 'firebase';
...
guardiansList: any = [];
warriorsList: any = [];
prayersList: any = [];
...
    try {
        firebase.database().ref().once('value', (snapshot) => {
            snapshot.forEach((categorySnap) => {

                switch (categorySnap.key) {
                    case "guardians":
                        categorySnap.forEach((imgSnap) => {
                            this.guardiansList.push(imgSnap.val());
                            return false;
                        });
                        break;
                    case "warriors":
                        categorySnap.forEach((imgSnap) => {
                            this.warriorsList.push(imgSnap.val());
                            return false;
                        });
                        break;
                    case "prayers":
                        categorySnap.forEach((imgSnap) => {
                            this.prayersList.push(imgSnap.val());
                            return false;
                        });
                        break;
                    default:
                        console.log("Found Unknown Key");
                        break;
                }

                return false;
            });
        });
    }
    catch (e) {
        console.log(e);
    }
...