我需要使用用户的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};
});
}));
}
}
答案 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
}