在Firebase中检索所有用户的所有数据

时间:2019-01-21 08:35:49

标签: javascript firebase firebase-realtime-database ionic3 angularfire2

我正在尝试使用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 :(得分:3)

如果要允许所有用户阅读所有用户的所有帖子,则需要授予他们对整个/report节点的访问权限。在您的安全规则中,您可以通过将".read": true规则上移一级来做到这一点:

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

但这意味着您还需要更新代码以侦听所有/report,然后在此之下循环各个用户。

答案 1 :(得分:2)

正如我所说,我对angularfire并不满意,但是这条线

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

对我来说似乎是为仅登录的用户提取数据, 我认为可能需要

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

然后遍历检索到的快照中的所有元素

更新

尝试将".read": true,移到$uid下方的reports上方, 复制其他答案中的确切规则