从Firestore获取数据时,如何创建使用用户uid的服务?角/消防站

时间:2019-02-10 01:43:53

标签: angular google-cloud-firestore

我需要使用用户的uid从Firestore中获取数据,因为我将数据(钻头)存储在以下Firestore路径下:rills / [user.uid] / userDrills / [drill.id]

我实现了通过uid存储数据的方法,因为我希望每个用户只能访问其数据(钻取)。在执行此操作之前,我有一个钻探服务文件,其中包含用于Firestore的所有CRUD方法,但是我无法及时从auth状态获取uid并将其注入查询中。甚至在服务的构造函数中获取uid都不起作用。

我目前的解决方案是不使用服务。这意味着我必须在三个不同的组件(列表,编辑/删除和新组件)中获取用户的uid。

有人对此有解决方案吗?有没有更好的方法来获取uid,然后运行查询?如果不是,那么仅通过创建规则在Firestore中处理用户权限会是更好的解决方案吗?

import { Component, OnInit } from '@angular/core';
import {Observable} from 'rxjs';
import { map } from 'rxjs/operators';

import {AngularFireAuth} from "@angular/fire/auth";
import {AngularFirestore, AngularFirestoreCollection} from 
 "@angular/fire/firestore";
import {Drill} from "../drill.model";

@Component({
  selector: 'app-drill-list',
  templateUrl: './drill-list.component.html',
  styleUrls: ['./drill-list.component.css']
})


export class DrillListComponent implements OnInit {

  drills: Observable<any[]>;
  drillsCollection: AngularFirestoreCollection<Drill>;
  userId: any;

  constructor(private afAuth: AngularFireAuth,
              private afs: AngularFirestore) { }

 ngOnInit() {
   this.afAuth.authState
    .subscribe((data) => {
      this.userId = data.uid;
      this.drillsCollection = this.afs.collection('drills/' + this.userId + '/userDrills',
          ref => ref.orderBy('title', 'asc'));
      this.drills = this.getDrills();
    });

}

 getDrills(): Observable<Drill[]> {
   return this.drillsCollection.snapshotChanges().pipe(map(actions => {
      return actions.map(a => {
         const data = a.payload.doc.data() as Drill;
         const id = a.payload.doc.id;
         return { id, ...data};
      });
    }));
  }

}

1 个答案:

答案 0 :(得分:0)

我已经通过在身份验证服务上保持可观察到的UID来实现了这一点。我使用“ fetchUid”方法来传递和过滤虚假值,并使用“ first”运算符之类的运算符来取消流。

类似的东西:

// in auth service
private uidSubject = new BehaviorSubject(null);
private uid$ = this.uidSubject.asObservable();

fetchUid() {
    return this.uid$.pipe(
        filter(v => v), // only allows the non falsy value through
        first(), // cancels stream after first
    );
}

// component
ngOnInit() {
    this.authService.fetchUid().pipe(
        // do stuff with uid
    ); // handle subscribe if needed
}