无法在 Angularfire2 中按我的意愿处理文档数据

Not able to handle document data as I want in Angularfire2

我有一个名为 'users' 的集合,其中包含一些虚拟数据,如下所示:

uid: {
  admin: false,
  uid: 'longhash',
  displayName: 'User Name',
  email: 'user@email.com'
}

我在处理文档中的 'admin' 数据异步处理时遇到问题。

我的代码:

  isAdmin:Observable<boolean> = this.uid.pipe(
switchMap(uid => {
  if(!uid){
    return observableOf(false);
  } else {

    let user = new BehaviorSubject<string>(uid);

    return user.pipe(
      switchMap(page =>
        this.afs.collection<User>('users', ref => ref.where('uid', '==', uid)).snapshotChanges().pipe(
          map(changes => {
            return changes.map(userData => {
              const cUser = userData.payload.doc.data() as User;
              return cUser ? cUser.admin : false;
            });
          })
        )
      )
    );
  }
})
);

这是我的 IDE 显示的错误:

有没有人知道我在这里做错了什么?

在你的 switchMap 运算符中,你正在 return 发射一个布尔值的 observable 或一个发射布尔值数组的 observable,这与 isAdmin 常量的类型声明不符 const isAdmin:Observable<boolean>。尝试这样的事情:isAdmin: Observable<boolean> | Observable<boolean[]>,它应该修复类型错误。

如果您的目标是 return 一个布尔值而不是布尔值数组,假设您的用户集合中只有一个文档包含您的 uid,那么试试这个:

isAdmin:Observable<boolean> = this.uid.pipe(
switchMap(uid => {
  if(!uid){
    return of(false);
  } else {

    return of(uid).pipe(
      switchMap(page =>
        this.afs.collection<User>('users', ref => ref.where('uid', '==', uid).limit(1)).snapshotChanges().pipe(
          map(changes => {
            return changes.map(userData => {
              const cUser = userData.payload.doc.data() as User;
              return cUser ? !!cUser.admin : false;
            })[0];
          })
        )
      )
    );
  }
})
);