我无法在Angularfire2中处理文档数据

时间:2018-10-15 22:49:21

标签: angular firebase google-cloud-firestore angularfire2 document

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

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显示的错误: ide error return

有人知道我在做什么错吗?

1 个答案:

答案 0 :(得分:1)

在switchMap运算符中,您将返回一个返回布尔值的观察值或一个布尔值数组的观察值,这与isAdmin常量const isAdmin:Observable<boolean>的类型声明不对应。尝试类似以下操作:isAdmin: Observable<boolean> | Observable<boolean[]>,它应该可以修复类型错误。

如果您的目标是返回一个布尔值而不是一个布尔值数组,并假设您的用户集中只有一个文档包含您的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];
          })
        )
      )
    );
  }
})
);