получить все данные от всех пользователей в FireBase - PullRequest
0 голосов
/ 21 января 2019

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

правила базы данных!

{
  "rules": {
  "report": {
      "$uid": {
        ".read": "true",
        ".write": "$uid === auth.uid"

      }
    }    

  }
}

Когда я пользуюсь этими правилами, пользователи не читают все сообщения другого пользователя! Только я могу прочитать мой пост.

основной код

 export class FeedPage {


itemsRef: AngularFireList<any>;
items: Observable<any[]>;

  constructor(public navCtrl: NavController, public navParams: NavParams, public fire: AngularFireAuth
    ,public alertCtrl: AlertController,public toastCtrl: ToastController,public popoverCtrl: PopoverController, 
    public db: AngularFireDatabase) 
    {


      // // Use snapshotChanges().map() to store the key
      // this.items = this.itemsRef.snapshotChanges().pipe(
      //   map(changes => 
      //     changes.map(c => ({ key: c.payload.key, ...c.payload.val() }))
      //   )

      }

      ionViewWillLoad(){
        this.fire.authState.subscribe(data => {
          if(data && data.email && data.uid){
            this.toastCtrl.create({
              message : ` welcome ${data.email}`,
              duration:2000
            }).present()


            this.itemsRef = this.db.list(`report/`+data.uid);
            // Use snapshotChanges().map() to store the key
            this.items = this.itemsRef.snapshotChanges().pipe(
              map(changes => 
                changes.map(c => ({ key: c.payload.key, ...c.payload.val() }))
              )
            );


          }

        })

      }
}

база данных

{
  "report" : {
    "8D3sENaBcLaXoGNnh1MPuoyj5LP2" : {
      "-LWl294Hs6YjkvJE5pqi" : {
        "post" : "ali",
        "title" : "dd"
      },
      "-LWlEonKLWfOttzirqp7" : {
        "post" : "sas",
        "title" : "ass"
      },
      "-LWlGvn81Kes2A-1UcC2" : {
        "post" : "asa",
        "title" : "asass"
      }
    },
    "WUM2HBkGo8TFDeOjEqO1s3lCj1p1" : {
      "-LWlHlhyS9m3ECS3wIdk" : {
        "post" : "qwqsasasa",
        "title" : "as"
      },
      "-LWlHmXZAJdSPZurO7ii" : {
        "post" : "qwqsasasa",
        "title" : "as"
      }
    }
  }
}

если я использую этот код для получения данных, я получаю пустые HTML-данные!

this.itemsRef = this.db.list(`report`);

enter image description here

если я использую этот код для извлечения данных, я получаю только свое собственное сообщение, а не все остальные пользователи.

this.itemsRef = this.db.list(`report/${data.uid}`);

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Если вы хотите разрешить всем пользователям читать все сообщения всем пользователям, вам нужно предоставить им доступ ко всему узлу /report. В ваших правилах безопасности вы делаете это, перемещая правило ".read": true на один уровень вверх:

{
  "rules": {
    "report": {
      ".read": true,
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }    
  }
}

Но это означает, что вам также необходимо обновить ваш код, чтобы прослушать все /report, а затем выполнить цикл по отдельным пользователям.

0 голосов
/ 21 января 2019

Как я уже сказал, я не очень хорош с angularfire, но эта строка

this.itemsRef = this.db.list(`report/${data.uid}`);

Мне кажется, что я получаю данные только для пользователя, который входит в систему, я думаю, что это может быть необходимо

this.itemsRef = this.db.list(`report`);

Затем переберите все элементы в полученном снимке

ОБНОВЛЕНИЕ

Попробуйте переместить ".read": true, над $uid, чуть нижеreports, скопируйте точное правило из другого ответа

...